Das Strukturmodul ahmt C-Strukturen nach. Es dauert mehr CPU-Zyklen für einen Prozessor, um ein 16-Bit-Wort an einer ungeraden Adresse oder ein 32-Bit-Dword an einer nicht durch 4 teilbaren Adresse zu lesen, daher fügen Strukturen "Pad-Bytes" hinzu, um Strukturelemente auf natürliche Grenzen fallen zu lassen. Berücksichtigen Sie:
Diese Struktur belegt 12 Bytes des Arbeitsspeichers (x ist Pad Bytes).
Python funktioniert ähnlich (siehe struct Dokumentation):
>>> import struct
>>> struct.pack('BHBL',1,2,3,4)
'\x01\x00\x02\x00\x03\x00\x00\x00\x04\x00\x00\x00'
>>> struct.calcsize('BHBL')
12
Compiler hat in der Regel einen Weg Polsterung auszuschalten. In Python ist eines von = <>! wird Polsterung beseitigen:
>>> struct.calcsize('=BHBL')
8
>>> struct.pack('=BHBL',1,2,3,4)
'\x01\x02\x00\x03\x04\x00\x00\x00'
Hüten Sie sich davor, lassen Struktur padding. In C sind diese Strukturen:
struct A { struct B {
short a; int a;
char b; char b;
}; };
sind in der Regel 4 bzw. 8 Bytes. Die Auffüllung erfolgt am Ende der Struktur, falls die Strukturen in einem Array verwendet werden. Dies hält die "a" -Mitglieder an korrekten Grenzen für Strukturen später im Array ausgerichtet. Python-Struktur-Modul nicht Pad am Ende:
>>> struct.pack('LB',1,2)
'\x01\x00\x00\x00\x02'
>>> struct.pack('LBLB',1,2,3,4)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
Ich frage mich, warum Python die Daten nicht in einem solchen Format packt. "01 01 00" gepackt Byte 0x01, kurz 0x01, aber es versucht es wie "01 00 01 00" auszupacken. Wie auch immer, ich habe mein Problem gelöst, ich füge immer '<' vor all meinen Formatcodes hinzu, um sie ungepolstert zu machen. Danke für die Erklärung. :) –
hatte ein ähnliches Problem, das '=' noch '@' löste nicht ... mit Code, den ich auf Mac auf Windows – jokoon
@ThomasO Warum sagst du es packt es als "01 01 00"? Ich sehe struct.pack ('BH', 1, 2) == '\ x01 \ x00 \ x02 \ x00'. – aij