如何在Python中使用struct将6个字节解 unpack 为单个整数

8 投票
2 回答
8840 浏览
提问于 2025-04-17 05:19

我有以下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)

撰写回答