Seite 1 von 1
struct grösse? [solved]
Verfasst: Dienstag 3. Mai 2005, 13:32
von rayo
Hi
Warum gibt das eine unterschiedliche Grösse?
Code: Alles auswählen
import struct
print struct.calcsize('HiiiI')
#ergibt 20
print sum( [struct.calcsize(x) for x in 'HiiiI'] )
#ergibt 18
Darum hab ich jetzt wieder einen Tag lang fehler gesucht :/.
Weiss einer mehr?
Gruss
Verfasst: Dienstag 3. Mai 2005, 22:44
von BlackJack
Es wird normalerweise das Padding verwendet, das auch der C Compiler für eine Struktur im angegebenen Format benutzen würde, das heisst der Compiler versucht die Daten auf "Wortgrenzen" auszurichten, damit der Prozessor schneller darauf zugreifen kann. Ein Speicherwort ist bei x86 Rechnern normalerweise 4 Bytes gross.
Dein erster Wert ist ein `short`, das ist 2 Bytes gross und dort werden 2 Füllbytes eingefügt, damit das folgende `int` auf einer Wortgrenze steht. Wenn Du das "Padding" weglassen möchtest, dann musst Du ein '=' am Anfang angeben:
Code: Alles auswählen
In [8]: struct.calcsize('H')
Out[8]: 2
In [9]: struct.calcsize('i')
Out[9]: 4
In [10]: struct.calcsize('Hi')
Out[10]: 8
In [11]: struct.calcsize('=Hi')
Out[11]: 6
Verfasst: Dienstag 3. Mai 2005, 22:55
von rayo
Danke, mir ging es mehr um die Erklärung warum.
Möchte das Padding nicht weglassen.
Ich wollte ein c-struct einlesen und hab die Felder einzeln eingelesen und da fehlten immer die 2Bytes Padding. Jetzt enpack ich die alle gleichtzeitig, so funktioniert es auch.
gruss
PS: somit funktioniert mein DVB-API wrapper schon recht gut