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ückgebencalcsize(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 1c Zeichenzeichenfolge der Länge 1 1b vorzeichenbehaftete Zeichenzahl Ganzzahl 1 B unsigned char integer 1? _Bool bool 1h short integer 2H unsigned short integer 2i int Ganzzahl 4I unsigned int oder long 4l long integer 4L unsigned long long 4q long long long 8Q unsigned long long long 8f float float 4d double float 8s char[] string 1p char [] string 1P void * longHinweis 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; }
import struct id, tag, version, count = struct.unpack("!H4s2I", s)
ss = struct.pack("!H4s2I", id, tag, version, count);
import struct a=12.34 #将a变为二进制 bytes=struct.pack('i',a)
a,=struct.unpack('i',bytes)
a='hello' b='world!' c=2 d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)
a,b,c,d=struct.unpack('5s6sif',bytes)
binfile=open(filepath,'rb') #读二进制文件 binfile=open(filepath,'wb') #写二进制文件
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!