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

时间:2017-03-21 21:53:38

标签: 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"

基本上,这是一个MCDI标记,编码为十六进制,由+符号分隔:

[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

其他项目以同样的方式失败:

>>> unpack('<Q', b"96")
error: unpack requires a bytes object of length 8

如何将此十六进制字符串填充到正确的长度,以便从中获取正确的值?

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用

[int(x, 16) for x in your_array] 

如果您想使用字节字符串,则首先需要unhexlify

>>> 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

使用zfill填充均匀长度。

>>> 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]
相关问题