Python Struct模块表现很奇怪

mdo*_*ogg 5 python

我正在使用struct模块,事情并没有像我预期的那样.由于我对模块的一些误解,我肯定.

import struct
s = struct.Struct('Q');
print s.size
s = struct.Struct('H L Q');
print s.size
s = struct.Struct('H I Q');
print s.size
s = struct.Struct('H I Q H');
print s.size
Run Code Online (Sandbox Code Playgroud)

这个输出是:

8
24
16
18
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?为什么第二和第三种不同尺寸,为什么第四种不是16?

ken*_*ytm 6

对齐问题.

假设您在64位非Windows平台上运行:Q和L长度为8字节,I为4字节,H为2字节.

并且这些类型必须放在其大小的倍数上以获得最佳效率.

因此,第二结构将被安排为:

HH______ LLLLLLLL QQQQQQQQ
Run Code Online (Sandbox Code Playgroud)

第三个结构:

HH__IIII QQQQQQQQ
Run Code Online (Sandbox Code Playgroud)

和第四个结构:

HH__IIII QQQQQQQQ HH
Run Code Online (Sandbox Code Playgroud)

如果您不想对齐,并且要求L到有4个字节(以下简称"标准"的大小),你需要使用=或>或<格式,如在http://docs.python.org/library/struct .html#struct-alignment:

import struct
s = struct.Struct('=Q')
print s.size
s = struct.Struct('=HLQ')
print s.size
s = struct.Struct('=HIQ')
print s.size
s = struct.Struct('=HIQH')
print s.size
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/EMlgm