如何使用Python中的struct将6个字节解压缩为单个整数

时间:2011-10-31 04:04:35

标签: python struct

我有以下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个字节的整数值?我不希望每个字节单独。

2 个答案:

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