In PHP wird die Funktion pack () verwendet, um Daten im angegebenen Format in binäre Zeichenfolgen zu packen, und wird häufig in Szenarien wie zugrunde liegender Datenverarbeitung, Netzwerkkommunikationsprotokolle, Dateiformatanalyse usw. verwendet, um die Binärdaten mit Pack () besser zu verstehen und zu debuggen .
In diesem Artikel wird ein einfacher Hexdump () -Funktion in PHP implementiert und die Funktion Pack () verwendet, um den verpackten binären Inhalt anzuzeigen.
Die Syntax der Funktion pack () lautet:
string pack(string $format, mixed ...$values)
$ format Gibt das Verpackungsformat der Daten an , wie z .
$ values ist eine Liste von Werten, die verpackt werden müssen.
Zum Beispiel:
$bin = pack('Cnv', 0x12, 0x3456, 0x789a);
Diese Anweisung erzeugt eine binäre Zeichenfolge mit:
1 Byte: 0x12
2 Bytes (Netzwerksequenz, Big-Endian): 0x3456
2 Bytes (Little-Endian, Little-Endian): 0x789a
Hier ist eine einfache Hexdump () -Funktion, die eine binäre Zeichenfolge in hexadezimaler Darstellung in Bytes mit den entsprechenden ASCII -Zeichen ausgibt:
function hexdump(string $data): void {
$len = strlen($data);
$offset = 0;
while ($offset < $len) {
// Pro Zeile zeigen16Byte
$chunk = substr($data, $offset, 16);
$hex = '';
$ascii = '';
for ($i = 0; $i < strlen($chunk); $i++) {
$byte = ord($chunk[$i]);
$hex .= sprintf("%02X ", $byte);
// Druckbare Zeichen zum Anzeigen von Originalzeichen,Andernfalls wird die Punktnummer angezeigt
$ascii .= ($byte >= 32 && $byte <= 126) ? $chunk[$i] : '.';
}
// Mängeln wieder ausmachen16Byte时的空格
$hex = str_pad($hex, 16 * 3);
// Ausgangsformat:Offset -Adresse + hexadezimal + ASCII
printf("%08X %s %s\n", $offset, $hex, $ascii);
$offset += 16;
}
}
Angenommen, wir möchten die Funktion pack () verwenden, um einige Daten zu verpacken und sie mit Hexdump () anzusehen:
<?php
// Verpackungsdaten:1Byte无符号字符,2Byte网络序,4Byte小端序
$binary = pack('C n V', 0x41, 0x4243, 0x44454647);
hexdump($binary);
?>
Nach der Ausführung lautet die Ausgabe wie folgt:
00000000 41 42 43 47 46 45 44 00 00 00 00 00 00 00 00 00 ABCGFED..........
Analyse :
0x41 ist das Charakter 'a'
0x4243 wird als 42 43 in Netzwerk -Byte -Reihenfolge ('B' 'C' gespeichert) gespeichert)
0x44454647 wird als 47 46 45 44 in kleiner Endnahme gespeichert (entsprechend ASCII 'G' 'f' 'e' 'D')
Die Formatzeichenfolge der Funktion pack () ist sehr leistungsfähig. Weitere Informationen finden Sie in der offiziellen Dokumentation wie m66.net/Manual/en/function.pack.php .
Die Implementierung von Hexdump () kann entsprechend den Anforderungen angepasst werden, z. B. die Unterstützung von mehr Formaten, Anzeigen von mehr Kommentaren usw.
Nicht druckbare Zeichen in binären Daten können nicht intuitiv verstanden werden, und Hexdump () kann verwendet werden, um das Debuggen zu erleichtern.
Mit den oben genannten Methoden können Entwickler die binäre Struktur nach Pack () intuitiv beobachten, was zum Debuggen und Verständnis des Datenformats hilft. Ich hoffe, dieser Artikel kann Ihnen helfen, schnell mit der Verwendung von Hexdump () und Pack () zu beginnen.