Dans PHP, la fonction Pack () est utilisée pour emballer les données en chaînes binaires dans le format spécifié. De nombreux développeurs l'utilisent lorsqu'ils traitent des protocoles réseau ou des fichiers binaires. Pack ("N", 12345) est une utilisation typique, ce qui signifie que l'entier 12345 est emballé en une chaîne binaire de 4 octets dans l'ordre des octets en grand-endan (ordre des octets du réseau).
Mais parfois, vous pouvez constater que les résultats que vous obtenez après avoir utilisé le pack ("n", 12345) sont incompatibles avec la sortie que vous attendez, et même "étrange" lorsqu'elles sont converties en hexadécimal ou en sortie. Pourquoi est-ce? Cet article vous aide à analyser les principes derrière.
Le caractère format "n" est représenté dans Pack () :
N : unigné long (4 octets, entier non signé 32 bits)
Big-endian, c'est-à-dire que l'octet élevé est devant et l'octet bas est à l'arrière
Par exemple, la représentation hexadécimale de l'Entier 12345 est 0x3039 , et son Big-Endien de 4 octets correspondant est:
00 00 30 39
Par conséquent, la chaîne binaire générée par Pack ("N", 12345) doit être convertie en hexadécimal en ces 4 octets.
Beaucoup de gens observent que les résultats «mal» et les raisons courantes comprennent:
Sortez directement les chaînes binaires vers le navigateur ou le terminal , contenant de nombreux caractères invisibles, ou certains octets sont analysés en caractères de contrôle, qui ressemble à du code brouillé.
Le résultat binaire n'est pas converti en un format lisible , comme l'hexadécimal ou la base64.
L'attente du résultat ne correspond pas à la signification réelle , par exemple, en pensant que Pack ("n", 12345) sortira directement la chaîne numérique "12345".
Supposons que nous écrivons le code PHP suivant:
<?php
$binary = pack("N", 12345);
echo bin2hex($binary);
?>
Le résultat de l'opération est:
00003039
Il s'agit du résultat de Big-endian attendu de 4 octets.
Si vous utilisez Echo $ binaire; Directement, vous verrez du code brouillé ou un blanc, car $ binaire est des données binaires, pas du texte ordinaire.
Démonstration d'erreur:
<?php
echo pack("N", 12345);
?>
Lors de la sortie d'une page Web ou d'un terminal, vous verrez du code brouillé ou pas de caractères visibles. Cela vous fait penser à tort que le résultat de Pack () est faux.
Pack ("N", 12345) renvoie une chaîne binaire de 4 octets dans l'ordre des octets Big-Endan, représentant le numéro 12345.
Le résultat est des données binaires, pas la chaîne "12345".
Lors de la visualisation des résultats, il est préférable de le convertir en un format lisible à l'aide de bin2hex () ou de méthodes similaires.
La sortie directe du binaire peut entraîner des résultats apparemment "étranges", mais pas des erreurs.
<?php
// Mettre le nombre12345Emballé4Octet binaire grand-ami
$binary = pack("N", 12345);
// Montre une représentation hexadécimale du binaire,Observation pratique
echo "Hex representation: " . bin2hex($binary) . "\n";
// Peut également être utilisé unpack Anti-décompression
$unpacked = unpack("N", $binary);
echo "Unpacked number: " . $unpacked[1] . "\n";
?>
Sortie après exécution:
Hex representation: 00003039
Unpacked number: 12345
Documentation officielle PHP sur le pack
Comprendre l'importance de Endian pour le traitement des données binaires
La relation entre le protocole de réseau et les données binaires