struct grösse? [solved]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

struct grösse? [solved]

Beitragvon rayo » Dienstag 3. Mai 2005, 13:32

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
Zuletzt geändert von rayo am Dienstag 3. Mai 2005, 22:57, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Dienstag 3. Mai 2005, 22:44

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 3. Mai 2005, 22:55

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder