Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
Python 将任意十六进制序列转换为字节_Python_Python 3.x_Byte - Fatal编程技术网

Python 将任意十六进制序列转换为字节

Python 将任意十六进制序列转换为字节,python,python-3.x,byte,Python,Python 3.x,Byte,我在Python 3中有以下字符串: b"1C+96+2D5C+30DE+5B58+7F78+AB96+D9FE+DDC8+101B6+12A96+14C97+17183+17324+19F19+1C986+1E1DD+1E7F1+20524+221BE+22674+23809+26B9F+27F2F+2B19E+2D23F+2FA58+31C6E+3355F+35F04" 本质上,这是一个编码为十六进制的标记,由+符号分割: [b'1C', b'96', b'2D5C', b'30DE

我在Python 3中有以下字符串:

b"1C+96+2D5C+30DE+5B58+7F78+AB96+D9FE+DDC8+101B6+12A96+14C97+17183+17324+19F19+1C986+1E1DD+1E7F1+20524+221BE+22674+23809+26B9F+27F2F+2B19E+2D23F+2FA58+31C6E+3355F+35F04"
本质上,这是一个编码为十六进制的标记,由
+
符号分割:

[b'1C',
 b'96',
 b'2D5C',
 b'30DE',
 b'5B58',
 b'7F78',
 b'AB96',
 b'D9FE',
 b'DDC8',
 b'101B6',
 b'12A96',
 b'14C97',
 b'17183',
 b'17324',
 b'19F19',
 b'1C986',
 b'1E1DD',
 b'1E7F1',
 b'20524',
 b'221BE',
 b'22674',
 b'23809',
 b'26B9F',
 b'27F2F',
 b'2B19E',
 b'2D23F',
 b'2FA58',
 b'31C6E',
 b'3355F',
 b'35F04']
因此,此列表中的第一项是一个32位(4字节)无符号整数,当读取时,它将读取给定CD上的曲目总数:

>>> int("1C", 16)
28
其余的项是64位无符号整数(8字节),但在这里被压缩以节省空间

我很难使用
struct
解压这些值,因为它们的大小不正确:

>>> struct.unpack('<I', b"C1")
error: unpack requires a bytes object of length 4

>>struct.unpack(“最简单的方法就是使用

[int(x, 16) for x in your_array] 
如果要使用字节字符串,首先需要
unexlify

>>> s = b'101B6'
>>> from binascii import unhexlify
>>> unhexlify(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: Odd-length string
在所有数据上运行

>>> def f(s):
...     return int.from_bytes(unhexlify(s.zfill(8)), "big")
... 
>>> L = [b'1C', b'96', b'2D5C', b'30DE', b'5B58', b'7F78', b'AB96', b'D9FE', b'DDC8', b'101B6', b'12A96', b'14C97', b'17183', b'17324', b'19F19', b'1C986', b'1E1DD', b'1E7F1', b'20524', b'221BE', b'22674', b'23809', b'26B9F', b'27F2F', b'2B19E', b'2D23F', b'2FA58', b'31C6E', b'3355F', b'35F04']
>>> [f(s) for s in L]
[28, 150, 11612, 12510, 23384, 32632, 43926, 55806, 56776, 65974, 76438, 85143, 94595, 95012, 106265, 117126, 123357, 124913, 132388, 139710, 140916, 145417, 158623, 163631, 176542, 184895, 195160, 203886, 210271, 220932]

不会
struct.unpack('@L3viathan,unpack需要一个二进制字符串,而不是十六进制编码值的二进制字符串。它可以工作,但给出了错误的答案。
>>> unhexlify(s.zfill(8))
b'\x00\x01\x01\xb6'
>>> int.from_bytes(unhexlify(s.zfill(8)), "big")
65974
>>> def f(s):
...     return int.from_bytes(unhexlify(s.zfill(8)), "big")
... 
>>> L = [b'1C', b'96', b'2D5C', b'30DE', b'5B58', b'7F78', b'AB96', b'D9FE', b'DDC8', b'101B6', b'12A96', b'14C97', b'17183', b'17324', b'19F19', b'1C986', b'1E1DD', b'1E7F1', b'20524', b'221BE', b'22674', b'23809', b'26B9F', b'27F2F', b'2B19E', b'2D23F', b'2FA58', b'31C6E', b'3355F', b'35F04']
>>> [f(s) for s in L]
[28, 150, 11612, 12510, 23384, 32632, 43926, 55806, 56776, 65974, 76438, 85143, 94595, 95012, 106265, 117126, 123357, 124913, 132388, 139710, 140916, 145417, 158623, 163631, 176542, 184895, 195160, 203886, 210271, 220932]