结构模块模仿C结构。处理器需要更多的CPU周期来读取奇数地址上的16位字或不能被4整除的地址上的32位双字,因此结构会添加“填充字节”以使结构成员落在自然边界上。考虑:
struct { 11
char a;
short b; ------------
char c; axbbcxxxdddd
int d;
};
该结构将占用12个字节的内存(x是填充字节)。
Python的工作方式类似(见struct文档):
>>> import struct
>>> struct.pack('BHBL',1,2,3,4)
'\x01\x00\x02\x00\x03\x00\x00\x00\x04\x00\x00\x00'
>>> struct.calcsize('BHBL')
12
编译器通常具有消除填充的方式。在Python中,任何= <>!将消除填充:
>>> struct.calcsize('=BHBL')
8
>>> struct.pack('=BHBL',1,2,3,4)
'\x01\x02\x00\x03\x04\x00\x00\x00'
小心让结构句柄填充。在C中,这些结构如下:
struct A { struct B {
short a; int a;
char b; char b;
}; };
通常分别是4字节和8字节。在结构用于数组的情况下,填充发生在结构的末尾。这使得'a'成员在数组后面的结构的正确边界上保持一致。 Python的结构模块不垫底:
>>> struct.pack('LB',1,2)
'\x01\x00\x00\x00\x02'
>>> struct.pack('LBLB',1,2,3,4)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
我想知道的是为什么Python没有将数据打包成这种格式。 “01 01 00”它打包字节0x01,短0x01,但它试图解压它像“01 00 01 00”。无论如何,我解决了我的问题,我总是在我的所有格式代码之前加上'<',以使它们没有填充的小端。谢谢你的解释。 :) – 2010-04-10 17:47:19
有一个类似的问题,'='和'@'没有解决...使用我在Windows上的Mac上做的代码 – jokoon 2011-09-28 23:57:26
@ThomasO你为什么说它将它打包为“01 01 00”?我看到struct.pack('BH',1,2)=='\ x01 \ x00 \ x02 \ x00'。 – aij 2016-07-14 20:19:05