Jeder sollte mit englischen Wörtern wie struct vertraut sein, denn in c/c++ gibt es struct, wobei struct structure heißt. Struct wird auch in Python verwendet, was vollständig zeigt, dass diese Struktur einen tiefen Ursprung mit der Struktur in c/c++ haben sollte. Python verwendet das Strukturmodul, um Konvertierungen zwischen Python-Werten und C-Strukturen durchzuführen, um Python-Byte-Objekte zu bilden. Es verwendet das Format string als kompakte Beschreibung der zugrunde liegenden C-Struktur und konvertiert dann den Formatstring in einen Python-Wert.
Wir wissen, dass Python nur 6 Datentypen definiert: Zeichenfolge, Ganzzahl, Gleitkommazahl, Liste, Tupel, Wörterbuch. Aber es gibt einige byteartige Variablen in der C-Sprache. Wie implementiert man sie in Python? Dies ist insbesondere dann sehr wichtig, wenn Daten über das Netzwerk übertragen werden sollen.
Python stellt ein Strukturmodul zur Konvertierung bereit. Hier sind einige Methoden in diesem Modul.
pack(fmt, v1, v2, ...) ------ Konvertieren Sie die Werte v1, v2, ... in eine Zeichenfolge entsprechend dem durch das angegebene fmt beschriebenen Format.
unpack(fmt, bytes) ------ Analysieren Sie die Bytes umgekehrt gemäß dem durch das angegebene fmt beschriebenen Format und geben Sie ein Tupel zurück.
calcsize(fmt) ------ Gibt die Größe der Struktur gemäß dem durch die angegebene fmt beschriebenen Format zurück.
struct.pack():
struct.pack wird verwendet, um den Python-Wert entsprechend dem Formatzeichen in eine Zeichenfolge umzuwandeln (da es in Python keinen Byte-Typ (Byte) gibt, Sie kann es hier einfügen Die Zeichenfolge wird als Byte-Stream oder Byte-Array verstanden. Der Funktionsprototyp lautet: struct.pack (fmt, v1, v2, ...), der Parameter fmt ist die Formatzeichenfolge, und die relevanten Informationen zur Formatzeichenfolge werden unten vorgestellt. v1, v2, ... stellen die zu konvertierenden Python-Werte dar. Das folgende Beispiel wandelt zwei Ganzzahlen in Strings (Byte-Streams) um:
>>> import struct
>>> >> b=400
>>> str=struct.pack('ii',a,b) #In Byte-Stream konvertieren, obwohl es immer noch ein String ist, kann aber übertragen werden im Netzwerk
>>>
printlen(str) #ii steht für zwei Ganzzahlen 8 Abschnitt, genau die Länge von zwei Daten vom Typ int
>>> print repr( str)
'x14x00x00x00x9 0x01x00x00' # Die Hexadezimalzahl 0x00000014, 0x00001009 stellt 20 bzw. 400 dar
>>>
Daraus können wir machen, was wir wollen. Im folgenden Verpackungsbeispiel beispielsweise nur verpacken
format = "!HH%ds" % len(data)
Puffer wird eingeführt = struct.pack(format,opcode,blocknumber,data)
Wir müssen Daten packen und einige Header hinzufügen. Anhand der folgenden Formatzeicheninformationen wissen wir, dass H ein vorzeichenloser und kurzer Abschnitt ist und s vom Typ char ist. Dieser Puffer besteht also aus einem 2-Byte-Opcode, einer 2-Byte-Blocknummer und einem len-langen Zeichen.
Python-Modul – Struktur (Byte-Stream, Gruppierungs- und Entpackimplementierung)
struct.unpack():
Fahren wir mit dem obigen Beispiellauf fort :
>>> a1,a2=struct.unpack('ii',str)
>>> print 'a1',a1
a1 20
>>> print 'a2=',a2
a2= 400
Sie können sehen, dass „ii“ durch vier Bytes For dargestellt wird Abgrenzung, der 8-Byte-Str ist in zwei Ganzzahlen vom Typ int unterteilt.
struct.calcsize(): Wird verwendet, um die Größe der Ausgabe in einem bestimmten Format zu berechnen, das ein paar Bytes beträgt, wie zum Beispiel:
>>> 'HH4s')
8
>>> struct.calcsize('ii')
8
>>>
>>> format='!HH%ds' % len('hello python')
>>> 🎜>16
>>>
Das obige ist der detaillierte Inhalt vonDetaillierte Beschreibung des Implementierungsmoduls für den Python-Strukturbyte-Stream, das Gruppieren und Entpacken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!