Dans PHP, la fonction Pack () est un puissant outil de packaging de données binaires, qui est souvent utilisé pour générer des données binaires transmises par le réseau, l'analyse du format de fichier et d'autres scénarios. Il convertit les données en chaînes binaires en fonction de la chaîne de format spécifiée. Cependant, de nombreux développeurs rencontrent souvent le problème de la "longueur de données incohérente conduit à un comportement anormal". Cet article analysera les causes en détail et vous apprendra comment les dépanner.
La fonction Pack () accepte deux paramètres:
string pack(string $format, mixed $values, mixed ...$values)
$ Format : Format String, définit le type et la longueur des données, tels que A4 représente une chaîne de 4 octets, N représente un entier Big-Endan non signé 32 bits, etc.
$ VALEURS : Données d'entrée dans le format correspondant.
Il renvoie une chaîne binaire qui emballe les données au format.
Supposons que vous utilisiez le format A4 (fixe de 4 octets) pour emballer une chaîne avec moins de 4 longueurs, PHP le remplira automatiquement avec des octets vides, ce qui est généralement le comportement attendu.
Cependant, si le format ne correspond pas aux données ou si la longueur du type de nombre est incorrecte, elle peut provoquer:
Les données de sortie sont anormales, ce qui entraîne une défaillance de l'analyse ultérieure.
Il y a une erreur dans le protocole réseau et la communication ne peut pas être effectuée normalement.
Le format de fichier est faux, le fichier est corrompu.
Par exemple:
<?php
// attendre4Chaîne d'octet,Mais seulement3octet
echo bin2hex(pack('a4', 'abc')); // 61626300,Fini à la fin0octet
// attendre4octet整数,Mais passer des cordes entraînera une exception
echo bin2hex(pack('N', 'abc')); // Une erreur sera rapportée ou des données imprévisibles seront générées
?>
La chaîne de format de pack () est très sensible au type. Les formats de type numérique (tels que n , l ) nécessitent des données entières et les formats de chaîne (tels que A , A ) nécessitent des chaînes.
<?php
$int = 1234;
$str = "hello";
// Utilisation correcte
$data = pack('N', $int);
// Mauvaise utilisation(Provoquera des exceptions)
$data = pack('N', $str);
?>
Pour les formats de chaîne de longueur fixe, tels que A4 et A8 , confirmez si la longueur de chaîne est suffisante ou trop longue.
Un va remplir les octets vides lorsque le format est insuffisant
A remplira les espaces lorsque le format A est insuffisant
Il sera coupé trop longtemps
<?php
echo bin2hex(pack('a4', 'abcde')); // 61626364,Une pièce excessive est tronquée
echo bin2hex(pack('A4', 'ab')); // 61622020,Composer des espaces plus tard
?>
Utilisez la fonction bin2hex () pour visualiser la représentation hexadécimale des données binaires renvoyées par pack () pour faciliter l'analyse de la satisfaction des attentes.
<?php
$data = pack('a4N', 'abc', 1234);
echo bin2hex($data);
?>
Pack () prend en charge plusieurs caractères de format et plusieurs valeurs correspondantes, et l'ordre doit être apparié.
<?php
// La chaîne de format a2Format des caractères,Doit passer2Paramètres
$data = pack('a4N', 'test', 100);
?>
Si le nombre de paramètres ne correspond pas, le résultat peut être incorrect.
Le manuel officiel et le tutoriel communautaire sont très utiles. Voici l'exemple d'adresse d'accès au code: