Dans PHP, la fonction Pack () est un outil puissant qui peut emballer les données dans des chaînes binaires dans le format spécifié, et est largement utilisé dans des scénarios tels que la transmission de données, l'écriture de fichiers et l'implémentation du protocole réseau. Cet article se concentre sur la façon d'utiliser le pack ("C *") pour emballer les tableaux et analyser leur utilisation, les techniques pratiques et les applications communes.
La syntaxe de base de la fonction Pack () est la suivante:
string pack ( string $format , mixed ...$values )
Où $ format spécifie le format d'emballage des données, tandis que "C" signifie convertir le paramètre en caractères non signés (c'est-à-dire 1 octet, plage 0 ~ 255). "C *" signifie emballer plusieurs valeurs au format de caractères non signé, ce qui convient à l'encodage de chaque élément dans le tableau en un seul octet.
Par exemple:
$data = [65, 66, 67];
$packed = pack("C*", ...$data);
echo $packed; // Sortir ABC
Dans ce code, 65 correspond au caractère ASCII A , 66 correspond à B et 67 correspond à C , donc la sortie finale est la chaîne "ABC" .
Pour convertir un tableau de nombres en données binaires via le pack ("C *") , les étapes générales sont les suivantes:
Préparez un tableau contenant des valeurs numériques, les valeurs dans le tableau doivent être comprises entre 0 et 255.
Passez le tableau en tant que paramètres multiples à emballer ("C *") en utilisant le déballage des paramètres ( ... ).
Pack () convertit chaque numéro en un octet et renvoie une chaîne binaire.
Exemple de code:
<?php
$array = [72, 101, 108, 108, 111]; // correspondre "Hello"
$binary = pack("C*", ...$array);
echo $binary; // Sortir: Hello
?>
Remarque: Pack () Renvoie une chaîne binaire, et il peut ne pas être sorti directement à l'aide d'écho . Si vous souhaitez le visualiser de manière visuelle, vous pouvez utiliser la fonction bin2hex () :
echo bin2hex($binary); // 48656c6c6f
Si le tableau est vide, l'appel Pack ("C *", ... $ array) signalera une erreur. Il est recommandé de juger d'abord:
if (!empty($array)) {
$binary = pack("C*", ...$array);
} else {
$binary = '';
}
Pack ("C *") nécessite que l'élément soit un entier de 0 ~ 255, sinon des résultats inattendus se produiront. Vous pouvez utiliser Array_Map pour limiter d'abord la portée:
$array = array_map(function($v) {
return $v & 0xFF; // Gardez uniquement le plus bas8Peu
}, $array);
Les données emballées sont souvent utilisées dans les protocoles de réseau personnalisés et peuvent convertir des tableaux entiers en flux d'octets, puis les envoyer à des serveurs distants.
Exemple:
$data = [1, 2, 3, 4];
$packet = pack("C*", ...$data);
$socket = stream_socket_client("tcp://m66.net:1234");
fwrite($socket, $packet);
fclose($socket);
Parfois, il est nécessaire d'écrire des fichiers de format binaire, tels que des informations d'en-tête d'image, des fichiers audio et vidéo, etc.
$header = [0x89, 0x50, 0x4E, 0x47]; // PNGSignature de fichiers
file_put_contents('file.png', pack("C*", ...$header));
Lorsqu'un protocole personnalisé envoie plusieurs champs, il est très courant de convertir les nombres en flux d'octets.
Pack ("C *") peut convertir les tableaux d'octets en chaînes, tandis que déballer ("C *", $ Str) peut implémenter les opérations inverses, ce qui facilite le code et le décodage.
Pack ("C *") est utilisé pour emballer un tableau d'entiers en chaînes binaires au format d'octets.
L'élément de tableau doit être compris entre 0 et 255 et le tableau vide doit être vérifié en premier.
Convient à divers scénarios tels que la transmission du réseau, la rédaction de fichiers et le développement du protocole.
Il utilise unpack ("C *") pour réaliser une conversion bidirectionnelle, ce qui le rend plus flexible pour traiter les données d'octets.
En utilisant le pack ("C *") rationnellement, vous pouvez traiter efficacement les données binaires, ce qui rend PHP plus puissant dans l'interaction de données de bas niveau.