我有以下8个字节:
b'\x05\x00\x00\x00\x00\x00\x05\x00'
我试图使用struct.unpack获得两个整数:一个用于前两个字节,一个用于最后一个6.获得前两个很容易使用:
struct.unpack("<H6B")
但是,返回
(5, 0, 0, 0, 0, 5, 0)
我希望它返回以下内容:
(5, 5)
如何获取最后6个字节的整数值?我不希望每个字节单独。
答案 0 :(得分:11)
struct
不支持非二次幂大小的整数。这很常见。 C也不支持你的平台上的这样的整数(好吧,位域,但你不能制作那些整数)。
def unpack48(x):
x1, x2, x3 = struct.unpack('<HHI', x)
return x1, x2 | (x3 << 16)
答案 1 :(得分:4)
标准结构模块不支持所有可能的大小,因此您必须自己加入一些位(请参阅Dietrich的答案),或者您可以使用bitstring之类的外部模块。
>>> from bitstring import BitArray
>>> b = BitArray(bytes=b'\x05\x00\x00\x00\x00\x00\x05\x00')
>>> b.unpack('<H6B')
[5, 0, 0, 0, 0, 5, 0]
与标准struct.unpack
相同。但现在我们可以将第二项解压缩为6字节(48位)的小端无符号整数:
>>> b.unpack('<H, uintle:48')
[5, 21474836480]
它给你的结果与迪特里希的答案相同,也表明你在问题中有错误的方法!在这种情况下你需要的是:
>>> b.unpack('uintle:48, <H')
[5, 5]
请注意,如果您想要更一致的表示法,也可以将<H
写为uintle:16
。