In PHP ist die Pack () -Funktion ein sehr leistungsstarkes Tool zum Verpacken von Daten in binäre Zeichenfolgen in einem bestimmten Format. Es wird häufig für die Netzwerkübertragung, das Schreiben von Dateien oder die Interaktion mit binären Protokollen verwendet. Entsprechend kann die Funktion pack () die verpackte binäre Zeichenfolge wieder zu strukturierten Daten analysieren. In diesem Artikel wird eingehender mit der Verwendung von Pack () und auspack () eingeführt, um die Verpackung und Parsen von benutzerdefinierten Strukturen zu erzielen, und hilft Ihnen dabei, die Anwendung durch bestimmte Beispiele besser zu verstehen.
Die Funktion pack () verpackt ein oder mehrere Daten in binären Zeichenfolgen basierend auf der Formatzeichenfolge. Gemeinsame Formate umfassen:
A : NUL -gefüllte Zeichenfolge (Zeichenfolge festgelegt)
A : Space Füllgefüllte Zeichenfolge (Zeichenfolge festgelegt)
C : Unsignierte Zeichen (1 Byte)
C : Signierte Zeichen (1 Byte)
S : Unsigned Short Ganzzahl (2 Bytes)
S : Signierte kurze Ganzzahl (2 Bytes)
L : Unsigned Long (4 Bytes)
L : Unterzeichnete lange Ganzzahl (4 Bytes)
N : Long Ganzzahl nicht signiert (4 Bytes, Netzwerk Endiangness)
N : Unsigned Short Integer (2 Bytes, Netzwerk Endiangness)
Angenommen, wir haben eine einfache Strukturdefinition wie folgt:
Benutzer -ID (unsignierte lange Ganzzahl, 4 Bytes)
Status (nicht signierte Zeichen, 1 Byte)
Bilanz (signierte kurze Ganzzahl, 2 Bytes)
Name (Länge 10 Byte Zeichenfolge)
Wie kann ich diese Daten mit pack () verpacken und mit auspack () analysieren?
<?php
// Daten definieren
$userId = 123456789;
$status = 1;
$balance = -250;
$name = "Zhang San";
// verwendenpack()Verpackungsdaten
// Formatbeschreibung:
// N - BenutzerID,Nicht signierte lange Ganzzahlen der Netzwerk Endiangness(4Byte)
// C - Zustand,Nicht signierte Zeichen(1Byte)
// s - Gleichgewicht,Signierte kurze Ganzzahl(2Byte)
// a10 - Name,Feste Länge10Byte,NULFüllung
$packedData = pack('NCsa10', $userId, $status, $balance, $name);
// Drucken Sie die hexadezimale Darstellung der verpackten Binärdaten aus,Leicht zu beobachten
echo "Gepackte Daten(hexadezimal): " . bin2hex($packedData) . PHP_EOL;
// Simulieren Sie die Datenübertragung über das Netzwerk,Nach dem Empfang auspacken
$unpackedData = unpack('NuserId/Cstatus/sbalance/a10name', $packedData);
// Drucken Sie ausgepacktes Array
print_r($unpackedData);
?>
Gepackte Daten(hexadezimal): 075bcd1501ff06e58f5a696e67
Array
(
[userId] => 123456789
[status] => 1
[balance] => -250
[name] => Zhang San
)
Das N- Format stellt eine nicht signierte lange ganze Zahl (4 Bytes) dar und übernimmt Netzwerk-Byte-Reihenfolge (Big Endian), die häufig für die plattformübergreifende Datenübertragung verwendet wird, um die konsistente Byte-Reihenfolge sicherzustellen.
C bedeutet vorzeichenlose Zeichen, 1 Byte, für Statusfelder.
S stellt eine signierte kurze Ganzzahl dar (2 Bytes), wobei der Restbetrag negativ ist und signierte Werte unterstützt werden.
A10 repräsentiert einen String mit fester Länge. Wenn die Saite nicht ausreicht, wird sie mit \ 0 gefüllt.
Die Funktion pack () packt Daten über dieselbe Formatzeichenfolge aus, gibt ein assoziatives Array zurück, und die Schlüsselnamen können angepasst werden, um den Zugriff auf jedes Feld zu erleichtern.
Byte Order Problem <br> Wenn die Daten zwischen verschiedenen Maschinenarchitekturen übertragen werden müssen, wird empfohlen, das Network Endian ( N , N ) -Format zu verwenden, um die Kompatibilität zwischen den kleinen und kleinen Enden sicherzustellen.
Saitenpolsterung <br> Wenn Sie das A -Format verwenden, füllen Sie den unzureichenden Teil der Zeichenfolge mit \ 0 aus, während A den Speicherplatz ausfüllt. Wählen Sie die entsprechende Füllmethode, um Parsenfehler zu vermeiden.
Datenlänge fixiert <br> Das Verpackungsformat muss streng mit dem Auspackformat übereinstimmen, insbesondere die Stringlänge muss gleich sein, andernfalls verursacht die Datenanalyse zu Fehlern.
Debugging -Fähigkeiten <br> Sie können Bin2hex () verwenden, um Binärdaten in hexadezimal umzuwandeln, um das Debuggen und Überprüfungen zu erleichtern.
Wenn Sie ein Datenpaket verpacken müssen, das ein URL -Feld enthält und der Domänenname -Teil durch m66.net ersetzt werden muss, können Sie zuerst die Zeichenfolge verarbeiten und dann: