Dans PHP, la fonction Pack () est utilisée pour emballer les données dans des chaînes binaires au format spécifié, et est souvent utilisée dans des scénarios tels que le traitement sous-jacent des données, les protocoles de communication réseau, l'analyse du format de fichier, etc. afin de mieux comprendre et déboguer les données binaires emballées par pack () , il est généralement nécessaire de visualiser sa structure d'ycte spécifique d'une manière binaire à hexdump .
Cet article présentera comment implémenter une fonction hexdump () simple en PHP et utilisera la fonction Pack () pour afficher le contenu binaire emballé.
La syntaxe de la fonction Pack () est:
string pack(string $format, mixed ...$values)
$ Format Spécifie le format d'emballage des données, tels que «C» signifie des caractères non signés (1 octet), «n» signifie entier court non signé 16 bits (ordre d'octet de réseau), «V» signifie 32 bits entier long non signé (ordre des octets peu endeur), etc.
$ Values est une liste de valeurs à emballer.
Par exemple:
$bin = pack('Cnv', 0x12, 0x3456, 0x789a);
Cette instruction génère une chaîne binaire contenant:
1 octet: 0x12
2 octets (séquence de réseau, Big-Endian): 0x3456
2 octets (Little-Endian, Little-Endian): 0x789A
Voici une fonction hexdump () simple qui publie une chaîne binaire en représentation hexadécimale en octets, avec les caractères ASCII correspondants:
function hexdump(string $data): void {
$len = strlen($data);
$offset = 0;
while ($offset < $len) {
// Spectacle par ligne16octet
$chunk = substr($data, $offset, 16);
$hex = '';
$ascii = '';
for ($i = 0; $i < strlen($chunk); $i++) {
$byte = ord($chunk[$i]);
$hex .= sprintf("%02X ", $byte);
// Caractères imprimables pour afficher les caractères originaux,Sinon, le numéro de point sera affiché
$ascii .= ($byte >= 32 && $byte <= 126) ? $chunk[$i] : '.';
}
// Compenser les lacunes16octet时的空格
$hex = str_pad($hex, 16 * 3);
// Format de sortie:Adresse de décalage + hexadécimal + ASCII
printf("%08X %s %s\n", $offset, $hex, $ascii);
$offset += 16;
}
}
Supposons que nous voulons utiliser la fonction Pack () pour emballer quelques données et les afficher avec hexdump () :
<?php
// Données d'emballage:1octet无符号字符,2octet网络序,4octet小端序
$binary = pack('C n V', 0x41, 0x4243, 0x44454647);
hexdump($binary);
?>
Après l'exécution, la sortie est la suivante:
00000000 41 42 43 47 46 45 44 00 00 00 00 00 00 00 00 00 ABCGFED..........
Analyse :
0x41 est le personnage «A»
0x4243 est stocké comme 42 43 dans l'ordre des octets réseau ('B' 'C')
0x44454647 est stocké comme 47 46 45 44 dans l'ordre des petites-endian (correspondant à ASCII 'G' 'F' 'E' 'D')
La chaîne de format de la fonction Pack () est très puissante. Pour plus de détails, veuillez vous référer à la documentation officielle, telle que m66.net/manual/en/fonction.pack.php .
La mise en œuvre de hexdump () peut être ajustée en fonction des exigences, telles que la prise en charge de plus de formats, l'affichage de plus de commentaires, etc.
Les caractères non imprimables dans les données binaires ne peuvent pas être compris intuitivement, et hexdump () peut être utilisé pour faciliter le débogage.
Grâce aux méthodes ci-dessus, les développeurs peuvent observer intuitivement la structure binaire après Pack () , qui aide à déboguer et à comprendre le format de données. J'espère que cet article peut vous aider à démarrer rapidement avec l'utilisation de hexdump () et de pack () .