如何在Python中使用struct将6个字节解 unpack 为单个整数
我有以下8个字节:
b'\x05\x00\x00\x00\x00\x00\x05\x00'
我想用struct.unpack来获取两个整数:一个是前两个字节,另一个是最后六个字节。获取前两个字节很简单,可以用:
struct.unpack("<H6B")
但是,这样返回的是
(5, 0, 0, 0, 0, 5, 0)
我希望它返回以下内容:
(5, 5)
我该如何获取最后六个字节的整数值?我不想要每个字节单独的值。
2 个回答
6
标准的结构体模块并不支持所有可能的大小,所以你要么得自己把一些位拼接在一起(可以参考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]
这样得到的结果和Dietrich的回答是一样的,同时也说明你在提问时有些地方搞错了!在这种情况下你需要的是:
>>> b.unpack('uintle:48, <H')
[5, 5]
注意,如果你想让表示方式更一致,你也可以把<H
写成uintle:16
。
13
struct
这个模块不支持大小不是2的幂的整数。这种情况很常见。在你的平台上,C语言也不支持这种整数(虽然有位域,但你不能用它们来创建数组)。
def unpack48(x):
x1, x2, x3 = struct.unpack('<HHI', x)
return x1, x2 | (x3 << 16)