2014-02-08 3 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 

Könnte mir jemand sagen, warum size_c 24 anstatt 22 (10 + 12)?struct.calcsize Länge

Antwort

11

Das hat mit alignment zu tun. Jeder bestimmte Typ (Byte, Ganzzahl, usw.) kann nur mit einem Offset beginnen, der ein Vielfaches seiner Standardgröße ist.

  • A Bytekette s auf jeder Offset beginnen kann, weil seine Standardgröße 1.

  • ist, aber eine 32-Bit-Ganzzahl i kann nur bei einem mit einem Vielfachen von 4 (seine Größe Offset beginnen). Z. B. 0, 4, 8, 12, usw.

Also, die struct 10siii Lassen Sie uns zunächst sezieren die 10-Byte-String zu analysieren.

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

10s nimmt die ersten 10 Bytes, die bis zu erwarten ist. Jetzt folgt die 3 ganze Zahlen.

      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-----> 

jede ganze Zahl umfasst 4 Bytes, aber jeder ist auf einer nur beginnen Offset, das ist ein Vielfaches von 4 (d, 8, 12, 16, 20, nicht mehr als 10). Da die Anfangs-Byte-Zeichenfolge 10 Byte belegt, muss sie um 2 Byte aufgefüllt werden, damit die Ganzzahlen einen korrekten Offset haben. Und so enden Sie mit einer Gesamtstrukturgröße bestehend aus: 10 (Anfangsbytezeichenfolge) + 2 (Auffüllung) + 12 (3 Ganzzahlen) = 24 Bytestruktur.

Verwandte Themen