Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Beschreibung der Verwendung von struct.pack() und struct.unpack() in Python

Detaillierte Beschreibung der Verwendung von struct.pack() und struct.unpack() in Python

高洛峰
高洛峰Original
2017-03-16 16:02:0113516Durchsuche

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

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

Während des Konvertierungsprozesses wird eine Formatzeichenfolge(for mat strings), wird zur Angabe der Konvertierungsmethode und des Formats verwendet.

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 eine 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 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 calcsizeFunktion 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:

Detaillierte Beschreibung der Verwendung von struct.pack() und struct.unpack() in Python

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)

Erste Packparameter 1,2,3 Vor dem Packen gehören 1,2,3 offensichtlich zum IntegerDatentyp 🎜>. Nach dem Packen wird es zu einer C-strukturierten Binärzeichenfolge, und wenn es in den Python-Zeichenfolgentyp konvertiert wird, wird es als „x01x00x00x00x02x00x03“ angezeigt. Da es sich bei dieser Maschine um eine Little-Endian-Maschine („little- endian“) 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. Die Maschine belegt 4 Bits, und 1 wird als 01000000 dargestellt. h stellt den kurzen Typ in der C-Struktur dar und belegt daher 2 Bits Vorzeichenbehafteter char-Typ in der C-Struktur, der 1 Bit einnimmt, daher wird er als 03 dargestellt.

Die Konvertierung anderer Strukturen ist ähnlich. Für einige spezielle Strukturen können Sie sich auf das Handbuch des Beamten beziehen Dokument.

Am Anfang der Formatzeichenfolge steht ein optionales Zeichen zur Bestimmung von Big Endian und Little Endian. Die Liste lautet wie folgt:

Detaillierte Beschreibung der Verwendung von struct.pack() und struct.unpack() in Python

Wenn nicht angehängt, wird für die Größe der C-Struktur und des Speichers standardmäßig @ verwendet, d Einige Maschinen haben beispielsweise eine Ganzzahl von 2 Bits und einige Maschinen haben eine Vier-Bit-Ganzzahl; einige Maschinenspeicher haben eine Vier-Bit-Ausrichtung und einige haben eine N-Bit-Ausrichtung (n ist unbekannt, ich weiß nicht wie viel).

Es gibt auch eine Standardoption, die wie folgt beschrieben wird: Wenn Sie Standard verwenden, 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.


Das obige ist der detaillierte Inhalt vonDetaillierte Beschreibung der Verwendung von struct.pack() und struct.unpack() in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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