Jeder sollte mit dem englischen Wort struct vertraut sein, da es struct in c/c gibt, wobei struct als Struktur bezeichnet wird. 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 eine Formatzeichenfolge als kompakte Beschreibung der zugrunde liegenden C-Struktur und konvertiert sie basierend auf dieser Formatzeichenfolge in einen Python-Wert.
Wir wissen, dass Python nur 6 Datentypen definiert: Zeichenfolgen, Ganzzahlen, Gleitkommazahlen, Listen, Tupel und Wörterbücher. Aber es gibt einige Byte-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 gemäß 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 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
>>> a=20
>>> b =400
>>> str=struct.pack('ii',a,b) #In Byte-Stream konvertieren, obwohl es immer noch eine Zeichenfolge ist, kann er im Netzwerk übertragen werden
> >> print len(str) #ii stellt zwei Ints dar
8 str
bis 014, 0x00001009 bedeutet 20 bzw. 400
>>>
Daraus Wir können Pakete beliebig gruppieren. Im folgenden Verpackungsbeispiel führen wir beispielsweise nur das Paket
format = "!HH%ds" % len(data)
buffer = struct.pack(format,opcode,blocknumber,data) Wir müssen Daten packen und einige hinzufügen. Für den Header wissen wir aus den folgenden Formatzeicheninformationen, dass H ohne Vorzeichen ist, kurz ist 2 Bytes und s ist der Typ char. 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',a1a1 20>>> print 'a2=',a2a2= 400Sie können sehen, dass „ii“ in vier Bytes und der 8-Byte-Str in unterteilt ist zwei ganze Zahlen. 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: >>> struct.calcsize('HH4s' )
8>>> struct.calcsize('ii')8>>>>>> format='! HH%ds' % len('hello python')>>> struct.calcsize(format)16>>>