如何将python2.7中的bytearray转换为十进制字符串?

2024-09-28 23:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的字节数组

>>> string_ba
bytearray(b'4\x00/\t\xb5')

它很容易转换成十六进制字符串,下面两行:

^{pr2}$

那个回报

>>> hex_string.lower()
'34002f09b5'

这是意料之中的。(这是RFID卡签名)

我通过执行上述操作将其转换为十进制,然后用下一行从十六进制字符串转换为十进制字符串(用零填充)。我的字符串限制为10个字符,因此我被迫删除字符串中的前2个字符,以便将其转换为最多10个字符的十进制数。在

dec_string = str(int(hex_string[2:], 16)).zfill(10)
>>> dec_string
'0003082677'

这是正确的,因为我用一个在线转换器(hex:002f09b5,dec:3082677)测试了这一点 问题是,如果有一种方法可以跳过从bytearray到hex_字符串的转换,以获得十进制字符串。换句话说,直接从bytearray到dec\u string

这将在python2.7.15上运行。在

>>> sys.version
'2.7.15rc1 (default, Apr 15 2018, 21:51:34) \n[GCC 7.3.0]'

我尝试从bytearray中删除第一个元素,然后将其直接转换为字符串并进行连接。但这并不能提供预期的结果。在

string_ba = string_ba[1:]
test_string = [str(x) for x in string_ba]
test_dec_string = ''.join(test_string).zfill(10)

>>> test_dec_string
'0000479181'

重复这个问题,有没有办法直接从bytearray转到十进制字符串


Tags: 字符串teststring字节数组dechexx00
2条回答

一个由n位组成的数字(我们称之为n)写为:

Dn-1Dn-2Dn-3…D2D10(其中每个Di都是基数B中的一个数字)

其值可根据以下公式计算:

VXin=-01(Bi*Di(注意,在本例中,数字是从右向左遍历的——遍历感不影响最终值)。在

例如,number2468(B10)=100*8+101*6+102*4+103*2=8+60+400+2000)。在

ASCII字符串实际上是一个基数2560x100的数字,其中每个字符(字节)都是一个数字。在

以下是基于上述情况的另一种选择:

  • 它只对整数执行数学运算(转换为字符串只在最后完成)
  • 遍历意义(从上)有助于限制(最终(十进制)数字必须适合多个数字,并且在溢出的情况下,最有效的数字将被忽略
  • 算法很简单,从右边开始,计算部分数值,直到达到允许的最大值,或者耗尽数字位数(字符串字符)

代码.py

#!/usr/bin/env python

import sys 


DEFAULT_MAX_DIGITS = 10


def convert(array, max_digits=DEFAULT_MAX_DIGITS):
    max_val = 10 ** max_digits
    number_val = 0
    for idx, digit in enumerate(reversed(array)):
        cur_val = 256 ** idx * digit
        if number_val + cur_val > max_val:
            break
        number_val += cur_val
    return str(number_val).zfill(max_digits)


def main():
    b = bytearray("4\x00/\t\xb5")
    print("b: {:}\n".format(repr(b)))
    for max_digits in range(6, 15, 2):
        print("Conversion of b (with max {:02d} digits): {:}{:s}".format(
            max_digits, convert(b, max_digits=max_digits),
            " (!!! Default case - required in the question)" if max_digits == DEFAULT_MAX_DIGITS else ""
        ))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main() 

输出

(py_064_02.07.15_test0) e:\Work\Dev\StackOverflow\q054091895>"e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code.py
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32

b: bytearray(b'4\x00/\t\xb5')

Conversion of b (with max 06 digits): 002485
Conversion of b (with max 08 digits): 03082677
Conversion of b (with max 10 digits): 0003082677 (!!! Default case - required in the question)
Conversion of b (with max 12 digits): 223341382069
Conversion of b (with max 14 digits): 00223341382069

可以使用结构库将bytearray转换为decimal。https://codereview.stackexchange.com/questions/142915/converting-a-bytearray-into-an-integer也许能帮你

相关问题 更多 >