Python 将任意十六进制序列转换为字节
我在Python 3中有以下字符串: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
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]