Heim > Backend-Entwicklung > Python-Tutorial > Einführung in die Verwendung von Pack und Unpack in Python

Einführung in die Verwendung von Pack und Unpack in Python

巴扎黑
Freigeben: 2017-08-21 14:47:37
Original
8033 Leute haben es durchsucht

Manchmal müssen Sie Python verwenden, um Binärdaten zu verarbeiten, z. B. beim Zugriff auf Dateien und Socket-Vorgänge. Zu diesem Zeitpunkt können Sie das Strukturmodul von Python verwenden, um Strukturen in der C-Sprache zu verarbeiten 🎜>

Die drei wichtigsten Funktionen im Strukturmodul sind pack(), unpack(), calcsize()

pack(fmt, v1, v2, ...) wie gegeben Ein gegebenes Format (fmt), kapseln Sie die Daten in einen String (eigentlich einen Byte-Stream ähnlich einer C-Struktur)

unpack(fmt, string) Analysieren Sie die Bytes entsprechend dem gegebenen Format (fmt) Stream-String , das geparste Tupel zurückgeben

calcsize(fmt) Berechnen Sie, wie viele Bytes Speicher das angegebene Format (fmt) belegt

Die unterstützten Formate in der Struktur sind wie folgt Tabelle :

Format C Typ Python Anzahl der Bytes

x Auffüllbyte kein Wert 1

c Zeichenzeichenfolge der Länge 1 1

b vorzeichenbehaftete Zeichenzahl Ganzzahl 1

B unsigned char integer 1

? _Bool bool 1

h short integer 2

H unsigned short integer 2

i int Ganzzahl 4

I unsigned int oder long 4

l long integer 4

L unsigned long long 4

q long long long 8

Q unsigned long long long 8

f float float 4

d double float 8

s char[] string 1

p char [] string 1

P void * long

Hinweis 1. q und Q sind nur interessant, wenn die Maschine 64-Bit-Operationen unterstützt

Hinweis 2. Jedem Format kann ein vorangestellt werden Eine Zahl, die die Zahl darstellt

Hinweis 3. Das s-Format stellt eine Zeichenfolge einer bestimmten Länge dar, 4s stellt eine Zeichenfolge der Länge 4 dar, aber p stellt eine Pascal-Zeichenfolge dar

Anmerkung 4. P Wird zum Konvertieren eines Zeigers verwendet. Seine Länge hängt von der Länge des Maschinenworts ab.

Hinweis 5. Der letzte kann zur Darstellung des Zeigertyps verwendet werden und belegt 4 Bytes

Dasselbe wie die Struktur in c. Beim Austausch von Daten per Körper sollten Sie auch berücksichtigen, dass einige C- oder C++-Compiler die Byte-Ausrichtung verwenden, bei der es sich normalerweise um ein 32-Bit-System mit 4 Bytes als Einheit handelt. Daher wird die Struktur entsprechend konvertiert Die Bytereihenfolge der lokalen Maschine kann zum Ändern der Ausrichtung verwendet werden:

Größe und Ausrichtung der Zeichenbytes

@nativ 4 Bytes bilden

= nativer Standard Anzahl der Abschnitte

< Little-Endian-Standard basierend auf der ursprünglichen Anzahl von Bytes

> Endian-Standard basierend auf der ursprünglichen Anzahl von Bytes

! Netzwerk (= Big-Endian)

Standard Gemäß der ursprünglichen Anzahl von Bytes wird

an der ersten Stelle verwendet fmt, genau wie '@5s6sif'

Beispiel 1:

Die Struktur ist wie folgt:

struct Header
{
    unsigned short id;
    char[4] tag;
    unsigned int version;
    unsigned int count;
}
Nach dem Login kopieren
Die obigen Strukturdaten werden über socket.recv empfangen wird in der Zeichenfolge s gespeichert. Sie können die Funktion unpack() verwenden:

import struct
id, tag, version, count = struct.unpack("!H4s2I", s)
Nach dem Login kopieren
In der obigen Formatzeichenfolge gibt ! an, dass wir die Netzwerk-Byte-Reihenfolge verwenden möchten Parsen, da unsere Daten vom Netzwerk empfangen werden und bei der Übertragung über das Netzwerk in der Netzwerk-Byte-Reihenfolge vorliegen. Das folgende H steht für eine vorzeichenlose kurze ID, 4s für eine 4 Byte lange Zeichenfolge und 2I für zwei vorzeichenlose int-Daten .

passiert einfach ein Entpacken, und jetzt wurden ID, Tag, Version, Anzahl unserer Informationen darin gespeichert.

In ähnlicher Weise ist es auch sehr praktisch, lokale Daten in das Strukturformat zu packen:

ss = struct.pack("!H4s2I", id, tag, version, count);
Nach dem Login kopieren
Die Pack-Funktion fügt ID, Tag, Version und Anzahl in eine Struktur ein. Der SS-Header ist jetzt eine Zeichenfolge (eigentlich ein Byte-Stream ähnlich einer C-Struktur). kann über socket.send(ss) verschickt werden.

Beispiel 2:

import struct
a=12.34
#将a变为二进制
bytes=struct.pack(&#39;i&#39;,a)
Nach dem Login kopieren
Zu diesem Zeitpunkt ist Bytes eine Zeichenfolge, und die Zeichenfolge entspricht dem binären Speicherinhalt von a in Bytes.

Führen Sie dann den umgekehrten Vorgang aus und konvertieren Sie die vorhandenen Binärdatenbytes (eigentlich eine Zeichenfolge) in den Python-Datentyp:

#Beachten Sie, dass beim Entpacken ein Tupel zurückgegeben wird!

a,=struct.unpack(&#39;i&#39;,bytes)
Nach dem Login kopieren
Wenn es aus mehreren Daten besteht, kann es so aussehen:

a=&#39;hello&#39;
b=&#39;world!&#39;
c=2
d=45.123
bytes=struct.pack(&#39;5s6sif&#39;,a,b,c,d)
Nach dem Login kopieren
Die Bytes sind zu diesem Zeitpunkt Daten in Binärform und können direkt in eine Datei wie Binfile geschrieben werden. write(bytes)

Wenn wir es dann brauchen, können wir es auslesen, bytes=binfile.read()

und es dann über struct.unpack() in eine Python-Variable dekodieren :

a,b,c,d=struct.unpack(&#39;5s6sif&#39;,bytes)
Nach dem Login kopieren
'5s6sif' heißt fmt und ist eine formatierte Zeichenfolge, die aus Zahlen und Zeichen besteht. 5s stellt eine Zeichenfolge mit 5 Zeichen dar, 2i repräsentiert 2 ganze Zahlen usw. Im Folgenden sind die verfügbaren Zeichen aufgeführt und Typen, ctype bedeutet, dass es den Typen in Python eins zu eins entsprechen kann.

Hinweis: Bei der Verarbeitung von Binärdateien sind Probleme aufgetreten

Wenn wir Binärdateien verarbeiten, müssen wir die folgende Methode verwenden:

binfile=open(filepath,&#39;rb&#39;)    
#读二进制文件
binfile=open(filepath,&#39;wb&#39;)   
#写二进制文件
Nach dem Login kopieren
Dann und binfile=open( Was ist der Unterschied zwischen den Ergebnissen von Dateipfad, 'r')?

Es gibt zwei Unterschiede:

Erstens: Wenn Sie bei der Verwendung von „r“ auf „0x1A“ stoßen, wird dies als das Ende der Datei betrachtet, also EOF. Bei Verwendung von „rb“ tritt dieses Problem nicht auf. Das heißt, wenn Sie im Binärformat schreiben und im Text auslesen, wird nur ein Teil der Datei ausgelesen, wenn „0X1A“ vorhanden ist. Bei Verwendung von „rb“ wird bis zum Ende der Datei gelesen.

Zweitens können wir für die Zeichenfolge x=’abcndef’ len(x) verwenden, um ihre Länge auf 7 zu bringen. Wir nennen n das Zeilenumbruchzeichen, das eigentlich „0X0A“ ist. Wenn wir im Textmodus „w“ schreiben, wird „0X0A“ auf der Windows-Plattform automatisch in zwei Zeichen „0X0D“, „0X0A“ geändert, dh die Dateilänge beträgt tatsächlich 8. Beim Lesen im Textmodus „r“ wird es automatisch in das ursprüngliche Zeilenumbruchzeichen konvertiert. Wenn Sie zum Schreiben in den Binärmodus „wb“ wechseln, bleibt ein Zeichen unverändert und wird beim Lesen so gelesen, wie es ist. Wenn Sie also im Textmodus schreiben und im Binärmodus lesen, müssen Sie dieses zusätzliche Byte berücksichtigen. „0X0D“ wird auch Wagenrücklaufzeichen genannt. Unter Linux wird sich das nicht ändern. Weil Linux nur „0X0A“ zur Darstellung von Zeilenumbrüchen verwendet.

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von Pack und Unpack in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage