struct pack返回太长

时间:2017-07-13 11:13:16

标签: python struct pack

我尝试使用struct.pack功能

import struct
values = (0, 44)
s = struct.Struct('HI')
b = s.pack(*values)
print(b)
print(str(len(b)))

它给了我这个输出:

b'\x00\x00\x00\x00,\x00\x00\x00'
8

python docs说:

Format - C Type         - Python type - Standard size - Notes

H      - unsigned short - integer     - 2             - (3)

I      - unsigned int   - integer     - 4             - (3)

所以len()应该是2 + 4 = 6,我需要大小= 6的字节

有什么想法吗?

我在Windows 10上使用Python 3.6

3 个答案:

答案 0 :(得分:4)

pack将添加填充字节,以便第二个整数对齐4个字节。来自the documentation

  

默认情况下,打包给定C结构的结果包括填充字节,以便维护所涉及的C类型的正确对齐;要...省略隐式填充字节,请使用标准大小和对齐而不是原生大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment

答案 1 :(得分:3)

这是"Data structure padding"的结果。它将填充H(2个字节+ 2个字节的填充),使其与I(4个字节)对齐。

但是,如果您需要减小尺寸,可以试用订单。引用维基百科:

  

通过重新排序结构成员或更改编译器对结构成员的对齐(或“打包”),可以更改结构的对齐以减少它们所需的内存(或符合现有格式)。

例如,在我的计算机上,只需交换HI

import struct
values = (0, 1)
s = struct.Struct('IH')         # swapped H and I
b = s.pack(*values)
print(b)                        # b'\x00\x00\x00\x00\x01\x00'
print(str(len(b)))              # 6
print(struct.calcsize('IH'))    # 6
print(struct.calcsize('HI'))    # 8

答案 2 :(得分:1)

对于包含的本机类型,大小计算不是直接附加的。您应该使用struct.calcsize计算大小:

In [8]: struct.calcsize('HI')
Out[8]: 8