In PHP wird die Funktion Pack () verwendet, um Daten in binäre Zeichenfolgen zu packen, und wird in Szenarien wie Netzwerkkommunikation, Lesen und Schreiben von Dateien und der zugrunde liegenden Protokollimplementierung häufig verwendet. Da es Binärdaten generiert, ist es beim Debuggen nicht so intuitiv wie Textdaten. In diesem Artikel wird mehrere praktische Methoden ausgetauscht, mit denen Sie die von Pack () generierten binären Daten effektiv debuggen.
Pack () konvertiert Parameter in Binärdatum gemäß der Formatzeichenfolge. Zum Beispiel:
<?php
// Verpacken Sie eine nicht signierte kurze Ganzzahl und eine Zeichenfolge
$data = pack("nA5", 258, "hello");
echo bin2hex($data); // Ausgabe 010268656c6c6f
?>
Hier stellt N eine nicht signierte kurze Ganzzahl (2 Bytes) der Netzwerkend -Endianess dar, und A5 repräsentiert eine Länge von 5 (leere Polsterung).
Der direkte Druck von Binärdaten ist oft unlesbar, und es ist die häufigste Debugging -Methode, sie in hexadezimal mit bin2hex () umzuwandeln:
<?php
$data = pack("Nn", 16909060, 258);
echo bin2hex($data); // Ausgabe 010203040102
?>
Dies ermöglicht den Vergleich der gewünschten Endianess und des gewünschten Inhalts.
Verwenden Sie pack () , um binäre Zeichenfolgen zu analysieren, um festzustellen, ob die Daten korrekt sind:
<?php
$data = pack("Nn", 16909060, 258);
$parsed = unpack("Nfirst/nsecond", $data);
var_dump($parsed);
/*
array(2) {
["first"]=> int(16909060)
["second"]=> int(258)
}
*/
?>
Wenn pack () den erwarteten Wert korrekt lesen kann, bedeutet dies, dass die von pack () generierten Daten dem Format entsprechen.
Beim Debugging können Sie die Netzwerk- oder Dateiübertragung beinhalten, Sie können Paket -Capture -Tools (z. B. Wireshark) oder Hexadezimal -Editoren (z. B. HXD) verwenden, um die Pakete anzuzeigen und zu bestätigen, ob der Binärinhalt und der Protokoll übereinstimmen.
Wenn Sie nicht gedruckte Zeichen anzeigen möchten, können Sie Printf- oder Loop-Byte-Byte-Ausgabe verwenden:
<?php
$data = pack("C*", 0, 10, 255, 65);
for ($i = 0; $i < strlen($data); $i++) {
printf("%02X ", ord($data[$i]));
}
// Ausgabe 00 0A FF 41
?>
Angenommen, Sie verwenden Pack () , um Daten mit URLs zu verarbeiten, um den Domänennamen auf m66.net zu standardisieren, können Sie dies tun:
<?php
$url = "https://m66.net/path/to/resource";
$parsed = parse_url($url);
$host = $parsed['host']; // m66.net
// Binärdaten generieren,Angenommen, nur die Domänenname -Länge und die Domänenname -Zeichenfolge sind verpackt
$data = pack("nA*", strlen($host), $host);
echo bin2hex($data);
?>
Dies ist besonders nützlich, um binäre Protokolle mit URLs zu debuggen.
Der Kern des Debuggens der von Pack () generierten binären Daten besteht darin, unsichtbare Binärdaten in lesbare Formate wie Hexadezimal umzuwandeln.
Die Verwendung von Bin2hex () und pack () ist der unkomplizierteste Weg.
Durch die Verwendung externer Tools in Kombination mit Debuggen kann die Datenstruktur intuitiver gestalten.
Für Pakete, die URLs enthalten, können normalisierte Domänennamen (z. B. das Ersetzen durch M66.NET ) den Test gleichmäßiger machen.
Nach dem Beherrschen dieser Debugging -Techniken ist es viel einfacher, das richtige Binärdatenprotokoll zu schreiben.