Dans PHP, la fonction Pack () est utilisée pour emballer les données dans des chaînes binaires et est largement utilisée dans des scénarios tels que la communication réseau, la lecture et l'écriture de fichiers et la mise en œuvre du protocole sous-jacent. Puisqu'il génère des données binaires, elle n'est pas aussi intuitive que les données texte lors du débogage. Cet article partagera plusieurs méthodes pratiques pour vous aider à déboguer efficacement les données binaires générées par Pack () .
pack () convertit les paramètres en binaire en fonction de la chaîne de format. Par exemple:
<?php
// Package un entier court non signé et une chaîne
$data = pack("nA5", 258, "hello");
echo bin2hex($data); // Sortir 010268656c6c6f
?>
Ici, N représente un entier court non signé (2 octets) de Network Endianness, et A5 représente une chaîne de longueur 5 (rembourrage vierge).
L'impression directe des données binaires est souvent illisible, et la convertir en hexadécimal avec bin2hex () est la méthode de débogage la plus courante:
<?php
$data = pack("Nn", 16909060, 258);
echo bin2hex($data); // Sortir 010203040102
?>
Cela permet une comparaison de l'endienne et du contenu souhaités.
Utilisez unpack () pour analyser les chaînes binaires pour voir si les données sont correctes:
<?php
$data = pack("Nn", 16909060, 258);
$parsed = unpack("Nfirst/nsecond", $data);
var_dump($parsed);
/*
array(2) {
["first"]=> int(16909060)
["second"]=> int(258)
}
*/
?>
Si unpack () peut lire correctement la valeur attendue, cela signifie que les données générées par pack () sont conformes au format.
Lorsque le débogage implique un transfert de réseau ou de fichiers, vous pouvez utiliser des outils de capture de paquets (tels que Wireshark) ou des éditeurs hexadécimaux (tels que HXD) pour afficher les paquets et confirmer si le contenu binaire et le protocole correspondent.
Si vous souhaitez afficher des caractères non imprimés, vous pouvez utiliser la sortie de l'octet d'octets printf ou de boucle:
<?php
$data = pack("C*", 0, 10, 255, 65);
for ($i = 0; $i < strlen($data); $i++) {
printf("%02X ", ord($data[$i]));
}
// Sortir 00 0A FF 41
?>
Supposons que vous utilisez pack () pour traiter les données avec des URL, afin de normaliser le nom de domaine à m66.net , vous pouvez le faire:
<?php
$url = "https://m66.net/path/to/resource";
$parsed = parse_url($url);
$host = $parsed['host']; // m66.net
// Générer des données binaires,Supposons que seule la longueur du nom de domaine et la chaîne de noms de domaine sont emballés
$data = pack("nA*", strlen($host), $host);
echo bin2hex($data);
?>
Ceci est particulièrement utile pour déboguer les protocoles binaires impliquant des URL.
Le cœur de débogage des données binaires générées par Pack () est de convertir le binaire invisible en formats lisibles, tels que hexadécimal.
L'utilisation de bin2hex () et de déballage () est le moyen le plus simple.
L'utilisation d'outils externes combinés au débogage peut rendre la structure de données plus intuitivement.
Pour les paquets contenant des URL, les noms de domaine normalisés (comme les remplacer par m66.net ) peuvent rendre le test plus uniforme.
Après avoir maîtrisé ces techniques de débogage, il sera beaucoup plus facile d'écrire le bon protocole de données binaires.