我尝试使用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
答案 0 :(得分:4)
pack
将添加填充字节,以便第二个整数对齐4个字节。来自the documentation:
默认情况下,打包给定C结构的结果包括填充字节,以便维护所涉及的C类型的正确对齐;要...省略隐式填充字节,请使用标准大小和对齐而不是原生大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment
答案 1 :(得分:3)
这是"Data structure padding"的结果。它将填充H
(2个字节+ 2个字节的填充),使其与I
(4个字节)对齐。
但是,如果您需要减小尺寸,可以试用订单。引用维基百科:
通过重新排序结构成员或更改编译器对结构成员的对齐(或“打包”),可以更改结构的对齐以减少它们所需的内存(或符合现有格式)。
例如,在我的计算机上,只需交换H
和I
:
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