Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Python-Strukturmoduls (Byte-Stream, Gruppierungs- und Entpackimplementierung).

Detaillierte Erläuterung des Python-Strukturmoduls (Byte-Stream, Gruppierungs- und Entpackimplementierung).

高洛峰
高洛峰Original
2016-10-19 11:12:052053Durchsuche

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',a1

a1 20

>>> print 'a2=',a2

a2= 400

Sie 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

>>>

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
Vorheriger Artikel:Python Advanced 01 WörterbuchNächster Artikel:Python Advanced 01 Wörterbuch