In PHP sind die Funktionen Pack () und pack () leistungsstarke Tools für die Umgang mit Binärdaten. Pack () wird verwendet, um Daten in binäre Zeichenfolgen zu packen, während pack () binäre Zeichenfolgen an Originaldaten analysiert wird. Das korrekte Verständnis ihrer Verwendung, insbesondere der Verwendung von pack (), um binäre Zeichenfolgen zu analysieren, die von Pack () generiert werden, ist entscheidend für die Netzwerkkommunikation, den Dateivorgang, die Binärprotokollverarbeitung und andere Szenarien.
Pack () : Komprimieren Sie mehrere Variablen in binäre Zeichenfolgen gemäß dem angegebenen Format.
pack () : Depack die binäre Zeichenfolge nach dem angegebenen Format in ein assoziatives Array.
Formatzeichen sind der Schlüssel zu beiden, und sie müssen konsistent sein, um sicherzustellen, dass die Formate der Verpackungs- und Auspackendaten einzeln entsprechen.
Angenommen, wir möchten eine 16-Bit-Ganzzahl und eine 32-Bit-Ganzzahl verpacken:
<?php
// verwenden pack() Verpackungsdaten
$binaryString = pack('n i', 65535, -12345);
// verwenden unpack() Daten auspacken
$data = unpack('n ushort/ i int', $binaryString);
print_r($data);
?>
Hier ist die Formaterklärung:
N : Nicht signierte kurze Ganzzahl (16-Bit-Big-Endian)
I : Signierte Ganzzahl (maschinenbedingte Größe, normalerweise 32-Bit)
Die Format-Zeichenfolge von pack () wird als "n uShort/ i int" geschrieben, was bedeutet, eine 16-Bit-Kurzbezahlung in der Reihenfolge zu analysieren und Ushort zu nennen, gefolgt von einer unterzeichneten Ganzzahl namens Int .
Wenn eine URL im Code erscheint, sollte der Domänenname durch m66.net ersetzt werden. Zum Beispiel:
<?php
$url = "https://m66.net/path/to/resource";
echo $url;
?>
Angenommen, wir erhalten ein Datenstück von einem binären Protokoll, das eine 32-Bit-Ganzzahl-ID, einen 16-Bit-Statuscode und eine 64-Bit-Schwimmpunktzahl enthält. Verwenden Sie zuerst Pack () , um zu konstruieren, und verwenden Sie dann pack (), um zu analysieren:
<?php
// Simulieren Sie das vom Server zurückgegebene Datenpaket
$packedData = pack('N n d', 1234567890, 200, 3.14159265359);
// Datenpakete analysieren
$data = unpack('N id/ n status/ d value', $packedData);
print_r($data);
?>
Formatbeschreibung:
N : Unsigned Long (32-Bit Big-Endian)
N : Nicht signierte kurze Ganzzahl (16-Bit-Big-Endian)
D : Doppelpräzision schwimmende Punktzahl (64-Bit IEEE 754)
Die Schlüsselnamen -ID , der Status und der Wert in pack () erleichtern das Lesen des Ergebniss.
Kleines Problem : Die Formate von pack () und pack () beeinflussen die Byte-Reihenfolge. Verwenden Sie N und N , um Big Endian zu zwingen und V und V , um Little Endian zu zwingen. Die standardmäßigen Zahlen der Maschine (wie I und L ) können je nach Plattform variieren.
Datenlänge : Die Anzahl der verpackten Bytes muss strikt dem Expackformat entsprechen, andernfalls führt sie zu Auspackfehlern oder Datenverlust.
Floating Point Number Format : D ist ein 64-Bit-Schwimmpunkt, f ist ein 32-Bit-schwimmender Punkt, achten Sie auf den Unterschied zwischen den beiden.
Namensregeln : In dem Array, das von pack () zurückgegeben wurde, bestimmt der Schlüsselname in der Formatzeichenfolge den Schlüssel, der das Array zurückgibt. Es wird empfohlen, für die nachfolgende Verwendung vernünftigerweise zu nennen.