Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Funktionen struct.pack() und struct.unpack() in Python

Detaillierte Einführung in die Funktionen struct.pack() und struct.unpack() in Python

高洛峰
高洛峰Original
2017-03-06 14:40:023452Durchsuche

Die Struktur in Python wird hauptsächlich zum Verarbeiten von C-Strukturdaten verwendet. Beim Lesen wird sie zunächst in den String-Typ von Python und dann in den strukturierten Typ von Python, z. B. Tupel, konvertiert. Im Allgemeinen stammen die Eingabekanäle aus Dateien oder Netzwerk-Binärströmen.

  1.struct.pack() und struct.unpack()

Im Konvertierungsprozess wird hauptsächlich eine Formatzeichenfolge verwendet Format.

Lassen Sie uns über die Hauptmethoden sprechen:

1.1 struct.pack(fmt,v1,v2,...)

Geben Sie v1, v2 und andere Parameter ein. Der Wert ist In einer Schicht verpackt, und die Verpackungsmethode wird durch fmt angegeben. Die verpackten Parameter müssen strikt mit fmt übereinstimmen. Schließlich wird als umschlossene Zeichenfolge zurückgegeben.

 1.2 struct.unpack(fmt,string)

 Wie der Name schon sagt, entpacken. Zum Beispiel wird pack verpackt und dann kann unpacked zum Auspacken verwendet werden. Gibt ein Tupel (Tupel) zurück, das durch Entpacken von Daten (Zeichenfolge) erhalten wurde. Auch wenn nur ein Datenwert vorhanden ist, werden diese in ein Tupel entpackt. Unter diesen muss len(string) gleich calcsize(fmt) sein, was eine calcsize-Funktion beinhaltet. struct.calcsize(fmt): Hiermit wird die Größe der im fmt-Format beschriebenen Struktur berechnet.

Die Formatzeichenfolge besteht aus einem oder mehreren Formatzeichen. Die Beschreibung dieser Formatzeichen finden Sie im Python-Handbuch wie folgt:

Format c Type Python Note
x pad byte no value  
c char string of length 1  
b signedchar integer  
B unsignedchar integer  
? _Bool bool (1)
h short integer  
H unsignedshort integer  
i int integer  
I unsignedint integer or long  
l long integer  
L unsignedlong long  
q longlong long (2)
Q unsignedlonglong long (2)
f float float  
d double float  
s char[] string  
p char[] string  
P void* long  

2. Codebeispiel

import struct 

# native byteorder 
buffer = struct.pack("ihb", 1, 2, 3) 
print repr(buffer) 
print struct.unpack("ihb", buffer) 

# data from a sequence, network byteorder 
data = [1, 2, 3] 
buffer = struct.pack("!ihb", *data)
print repr(buffer) 
print struct.unpack("!ihb", buffer)

 

 

Output:

'\x01\x00\x00\x00\x02\x00\x03'
(1, 2, 3)
'\x00\x00\x00\x01\x00\x02\x03'
(1, 2, 3)

Code anzeigen

Zuerst Parameter 1,2,3 ändern Vor dem Packen gehören 1,2,3 offensichtlich zur Ganzzahl im Python-Datentyp. Nach dem Packen wird es zu einer C-strukturierten Binärzeichenfolge, die als „x01x00x00x00x02x00x03“ angezeigt wird. Da es sich bei dieser Maschine um eine Little-Endian-Maschine handelt, finden Sie hier Informationen zum Unterschied zwischen Big-Endian und Little-Endian. Daher werden die hohen Bits im unteren Adresssegment platziert. i stellt den int-Typ in der C-Struktur dar Diese Maschine belegt 4 Bits, 1. Ausgedrückt als 01000000; Es wird als 03 ausgedrückt. Die Konvertierung der Struktur ist ebenfalls ähnlich. Sie können sich auch auf das Handbuch des offiziellen Dokuments beziehen.

optionales Zeichen zur Bestimmung von Big Endian und Little Endian. Die Liste lautet wie folgt:

Wenn nicht angehängt, ist der Standardwert @. Auch wenn die native Zeichenreihenfolge (Big Endian oder Little Endian) verwendet wird, stimmen die Größe der C-Struktur und die Ausrichtung im Speicher mit der nativen Maschine (nativ) überein Beispiel: Die Ganzzahl einiger Maschinen beträgt 2 Bits, während einige Maschinen vier Bits haben; einige Maschinenspeicher haben vier ausgerichtete Bits und einige haben n ausgerichtete Bits (n ist unbekannt, und ich weiß nicht, wie viele).

Es gibt auch eine Standardoption, die wie folgt beschrieben wird: Wenn Standard verwendet wird, gibt es für keinen Typ eine Speicherausrichtung.

Beispielsweise ist in der zweiten Hälfte des Applets gerade das erste Bit in der verwendeten Formatzeichenfolge! Dies ist die Standardausrichtung im Big-Endian-Modus. Die Ausgabe lautet also „x00x00x00x01x00x02x03“, wobei das High-Bit selbst im High-Adress-Bit des Speichers platziert wird.

Eine ausführlichere Einführung in die Funktionen struct.pack() und struct.unpack() in Python finden Sie auf der chinesischen PHP-Website!

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn