2014-02-08 87 views
7
>>>import struct 
>>>size_a = struct.calcsize('10s') 
size_a = 10 
>>>size_b = struct.calcsize('iii') 
size_b = 12 
>>>size_c = struct.calcsize('10siii') 
size_c = 24 

有人能告訴我爲什麼size_c是24而非22(10 + 12)?Python的struct.calcsize長度

回答

11

這與alignment有關。任何特定類型(字節,整數, 等)只能以其標準大小的倍數開始。

  • 甲字節串s可以在任何偏移開始,因爲它的標準尺寸是1.

  • 但是32位整數i僅能夠在具有4 的倍數偏移開始(其大小)。例如,0,4,8,12,等等

所以,分析結構10siii讓我們首先解剖10字節串。

Offset: 0 1 2 3 4 5 6 7 8 9 
     s-----------------> 

10s佔用前10個字節是可以預料的。現在是 下面3個整數。

      1 1 1 1 1 1 1 1 1 1 2 2 2 2 
Offset: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 
     s-----------------> x x i-----> i-----> i-----> 

每個整數跨越4個字節,但每個只能在一個開始偏移,這是一個多 的4(即,8,12,16,20,而不是10)。由於起始字節字符串佔用10個字節,因此必須用2個字節填充 以允許整數處於適當的偏移量。因此,您最終得到的結構總大小爲:10(開始字節字符串)+2(填充)+12(3個整數)= 24字節結構。