In PHP wird die Funktion pack () verwendet, um Daten im angegebenen Format in binäre Zeichenfolgen zu packen. Viele Entwickler verwenden es beim Umgang mit Netzwerkprotokollen oder Binärdateien. Pack ("N", 12345) ist eine typische Verwendung, was bedeutet, dass die Ganzzahl 12345 in eine 4-Byte-Binärstrahl in Large-Endian-Byte-Reihenfolge (Netzwerk-Byte-Reihenfolge) verpackt ist.
Aber manchmal stellen Sie möglicherweise fest, dass die Ergebnisse, die Sie nach der Verwendung von Pack ("N", 12345) erhalten, nicht mit der von Ihnen erwarteten Ausgabe übereinstimmen und sogar "seltsam" aussehen, wenn sie in Hexadezimal oder Ausgabe konvertiert werden. Warum ist das? Dieser Artikel hilft Ihnen bei der Analyse der Prinzipien dahinter.
Das Formatcharakter "N" ist in pack () dargestellt:
N : Long vorzeichenlos (4 Bytes, 32-Bit-Unsigned Ganzzahl)
Big-Endian, das heißt, das hohe Byte steht vor und das niedrige Byte im Rücken
Zum Beispiel beträgt die hexadezimale Darstellung von Ganzzahl 12345 0x3039 und der entsprechende 4-Byte-Big-Endian ist:
00 00 30 39
Daher sollte die durch Pack ("N", 12345) erzeugte binäre Zeichenfolge in diese 4 Bytes in Hexadezimal umgewandelt werden.
Viele Menschen beobachten, dass die Ergebnisse „falsch aussehen“ und häufige Gründe sind:
Direkt binäre Zeichenfolgen in den Browser oder Terminal ausgeben , das viele unsichtbare Zeichen enthält, oder einige Bytes werden in Kontrollzeichen analysiert, die wie ein verstümmelter Code aussehen.
Das binäre Ergebnis wird nicht in ein lesbares Format wie Hexadezimal oder Base64 umgewandelt .
Die Erwartung des Ergebnisses stimmt nicht mit der tatsächlichen Bedeutung überein , beispielsweise der Ansicht, dass Pack ("N", 12345) die numerische Zeichenfolge "12345" direkt ausgibt.
Angenommen, wir schreiben den folgenden PHP -Code:
<?php
$binary = pack("N", 12345);
echo bin2hex($binary);
?>
Das Ergebnis der Operation ist:
00003039
Dies ist das erwartete 4-Byte-Big-Endian-Ergebnis.
Wenn Sie Echo $ Binary verwenden; Direkt sehen Sie verstümmelte Code oder leer, da $ Binary Binärdaten und kein normaler Text sind.
Fehlerdemonstration:
<?php
echo pack("N", 12345);
?>
Wenn Sie auf eine Webseite oder ein Terminal ausgegeben werden, sehen Sie verstümmelte Code oder keine sichtbaren Zeichen. Dies lässt Sie fälschlicherweise denken, dass das Ergebnis von Pack () falsch ist.
Pack ("N", 12345) gibt eine 4-Byte-Binärquote in Big-Endian-Byte-Reihenfolge zurück, die die Nummer 12345 darstellt.
Das Ergebnis sind Binärdaten, nicht die Zeichenfolge "12345".
Beim Anzeigen der Ergebnisse ist es am besten, es mithilfe von Bin2hex () oder ähnlichen Methoden in ein lesbares Format umzuwandeln.
Die direkte Ausgabe von Binärer kann zu scheinbar "seltsamen" Ergebnissen führen, aber nicht zu Fehlern.
<?php
// Setzen Sie die Nummer ein12345Gepackt in4Byte Big-Endian Binary
$binary = pack("N", 12345);
// Zeigt eine hexadezimale Darstellung von binär,Bequeme Beobachtung
echo "Hex representation: " . bin2hex($binary) . "\n";
// Kann auch verwendet werden unpack Anti-Dekompression
$unpacked = unpack("N", $binary);
echo "Unpacked number: " . $unpacked[1] . "\n";
?>
Ausgabe nach Ausführung:
Hex representation: 00003039
Unpacked number: 12345
PHP Offizielle Dokumentation über Pack
Verstehen Sie die Bedeutung von Endian für die Binärdatenverarbeitung
Die Beziehung zwischen Netzwerkprotokoll und binären Daten