2011-10-31 15 views
5

我有以下的8个字节:如何解压使用结构6个字节作为一个整数Python中

b'\x05\x00\x00\x00\x00\x00\x05\x00' 

我试图用struct.unpack获得两个整数:一个用于第2个字节,一个在过去6获取前两种是容易使用:

struct.unpack("<H6B") 

但是,返回

(5, 0, 0, 0, 0, 5, 0) 

我希望它返回以下内容:

(5, 5) 

如何获取最后6个字节的整数值?我不需要单独的每个字节。

回答

10

struct不支持非二幂函数大小的整数。这很常见。 C在你的平台上不支持这样的整数(好吧,bitfields,但你不能对这些数组进行排序)。

def unpack48(x): 
    x1, x2, x3 = struct.unpack('<HHI', x) 
    return x1, x2 | (x3 << 16) 
+0

这个伎俩。谢谢! –

3

标准结构模块不支持所有可能的尺寸让你无论是有一些位一起加入自己(见迪特里希的答案),或者您可以使用外部模块如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位)little-endian的无符号整数:

>>> b.unpack('<H, uintle:48') 
[5, 21474836480]     

它给你同样的结果迪特里希的回答,也表明你已经得到的东西错了回答你的问题!你在这种情况下,需要的是:

>>> b.unpack('uintle:48, <H') 
[5, 5] 

注意,你也可以写<Huintle:16,如果你想更一致的符号。

相关问题