Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python2.7中的bytearray转换为十进制字符串?_Python_Arrays_String_Python 2.7_Decimal - Fatal编程技术网

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

如何将Python2.7中的bytearray转换为十进制字符串?,python,arrays,string,python-2.7,decimal,Python,Arrays,String,Python 2.7,Decimal,我有以下字节数组 >>> string_ba bytearray(b'4\x00/\t\xb5') 可通过以下两行轻松转换为十六进制字符串: hex_string = [chr(x).encode('hex') for x in string_ba] hex_string = ''.join(hex_string) 那个回归 >>> hex_string.lower() '34002f09b5' 这是意料之中的。这是一个RFID卡签名 我通过执行上述操作

我有以下字节数组

>>> string_ba
bytearray(b'4\x00/\t\xb5')
可通过以下两行轻松转换为十六进制字符串:

hex_string = [chr(x).encode('hex') for x in string_ba]
hex_string = ''.join(hex_string)
那个回归

>>> 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_字符串

这将在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转换为十进制字符串

您可以使用struct library将bytearray转换为十进制字符串。也许可以帮助你

一个数字,我们称它为X,由n个数字组成,B写为:

Dn-1Dn-2Dn-3…D2D1D0,其中每个Di是基数B中的一个数字

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

VX=σin=-01Bi*Di注意,在本例中,数字是从右向左遍历的-遍历意义不影响最终值

例如,数字2468B10=100*8+101*6+102*4+103*2=8+60+400+2000

ASCII字符串实际上是以256 0x100为基数的数字,其中每个字符字节都是一个数字

以下是基于上述内容的备选方案:

它只对整数执行数学运算。到字符串的转换只在最后完成 上面的遍历意义有助于限制最后的十进制数必须适合一定数量的数字,并且在溢出的情况下,最重要的数字将被忽略 算法很简单,从右边开始,计算部分数值,直到达到最大允许值,或者耗尽数字字符串字符 code.py:

!/usr/bin/env python 导入系统 默认\u最大\u位数=10 def convertarray,最大数字=默认最大数字: 最大值=10**最大值位数 数值=0 对于idx,枚举反向数组中的数字: cur_val=256**idx*位 如果数字值+当前值>最大值: 打破 数字=当前值 返回strnumber\u val.zfillmax\u位 def主: b=字节数组4\x00/\t\xb5 printb:{:}\n.formatreprb 对于范围为6、15、2的最大\u位数: 最大{:02d}位数为{:}{:s}.format的b的打印转换 最大位数,转换器B,最大位数=最大位数, !!! 默认情况-如果max\u digits==Default\u max\u digits,则问题中需要 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 在{:s}上打印Python{:s}\n.formatsys.version,sys.platform 主要的 输出:


所以十六进制字符串的第一部分应该被忽略,如果它不适合10位小数?转换应该是面向字节的?考虑到每个十六进制数字可以单独转换,这将产生不同的result@CristiFati对这就是我的想法。编辑:实际上,我完全忽略了第一个字节,从左4开始创建了10位十进制数字的字符串。我不理解面向字节的问题。你能重新措辞吗?
(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