結構模塊模仿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