2017-07-13 4 views
6

Ich versuche, die struct.pack Funktionstruct Pack Return ist zu lang

import struct 
values = (0, 44) 
s = struct.Struct('HI') 
b = s.pack(*values) 
print(b) 
print(str(len(b))) 

zu verwenden und es gibt mir diese Ausgabe:

b'\x00\x00\x00\x00,\x00\x00\x00' 
8 

während die python docs sagen:

Format - C Type   - Python type - Standard size - Notes 

H  - unsigned short - integer  - 2    - (3) 

I  - unsigned int - integer  - 4    - (3) 

so len() sollte 2 + 4 = 6, und ich brauche Bytes mit der Größe = 6

Irgendwelche Ideen?

Ich verwende Python 3.6 auf 10 Windows-

Antwort

4

pack wird Auffüllbytes hinzufügen, so dass die zweite ganze Zahl ist, 4-Byte-ausgerichtet sind. Von the documentation:

Standardmäßig enthält das Ergebnis des Packen einer gegebenen C-Struktur Pad-Bytes, um die richtige Ausrichtung für die beteiligten C-Typen beizubehalten; Um ... implizites Füllbytes weglassen, verwenden Standard-Größe und Ausrichtung statt nativer Größe und Ausrichtung: siehe Byte Order, Size, and Alignment für Details

+3

Das ist mir eine Antwort bekam, benutzen Sie sollte 'struct.Struct ('= HALLO')', 'struct .Struct (' HI') '', – Dela

1

Die Berechnung Größe nicht direkt für die enthaltenen nativen Typen additiv. Sie sollten die Größe struct.calcsize Verwendung berechnen:

In [8]: struct.calcsize('HI') 
Out[8]: 8 
3

Das ist eine Folge der "Data structure padding" ist. Es wird die H (2 Bytes + 2 Bytes Padding) auffüllen, so dass es mit der I (4 Bytes) ausgerichtet ist.

Sie können jedoch mit der Bestellung experimentieren, wenn Sie die Größe verringern müssen. Wikipedia zu zitieren:

Es ist möglich, die Ausrichtung von Strukturen zu ändern, um die Speicher benötigen sie zu reduzieren (oder zu einem bestehenden Format zu entsprechen) durch Strukturelemente Nachbestellung oder die Compiler Ausrichtung zu ändern (oder „Verpackung“) von Strukturmitglieder.

Zum Beispiel auf meinem Computer funktioniert es, wenn Sie nur den H und I tauschen:

import struct 
values = (0, 1) 
s = struct.Struct('IH')   # swapped H and I 
b = s.pack(*values) 
print(b)      # b'\x00\x00\x00\x00\x01\x00' 
print(str(len(b)))    # 6 
print(struct.calcsize('IH')) # 6 
print(struct.calcsize('HI')) # 8