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

Aar*_*ton 7 python struct

我有以下8个字节:

b'\x05\x00\x00\x00\x00\x00\x05\x00'
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用struct.unpack获得两个整数:一个用于前两个字节,一个用于最后一个.获得前两个很容易使用:

struct.unpack("<H6B")
Run Code Online (Sandbox Code Playgroud)

但是,那会回来

(5, 0, 0, 0, 0, 5, 0)
Run Code Online (Sandbox Code Playgroud)

我希望它返回以下内容:

(5, 5)
Run Code Online (Sandbox Code Playgroud)

如何获取最后6个字节的整数值?我不希望每个字节单独.

Die*_*Epp 11

struct不支持非二次幂大小的整数.这很常见.C不支持你的平台上的这样的整数(嗯,位域,但你不能制作那些整数).

def unpack48(x):
    x1, x2, x3 = struct.unpack('<HHI', x)
    return x1, x2 | (x3 << 16)
Run Code Online (Sandbox Code Playgroud)


Sco*_*ths 6

标准 struct 模块不支持所有可能的大小,因此您必须自己将一些位连接在一起(请参阅 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]
Run Code Online (Sandbox Code Playgroud)

这与标准相同struct.unpack。但现在我们可以将第二项解压为 6 字节(48 位)小端无符号整数:

>>> b.unpack('<H, uintle:48')
[5, 21474836480]                   
Run Code Online (Sandbox Code Playgroud)

这给了你与迪特里希的答案相同的结果,并且还表明你的问题有一些错误!在这种情况下你需要的是:

>>> b.unpack('uintle:48, <H')
[5, 5]
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以像想要更一致的符号<H一样编写。uintle:16