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