Dans PHP, la fonction Pack () est un outil très puissant pour emballer les données en chaînes binaires dans un format spécifié. Il est souvent utilisé pour la transmission du réseau, la rédaction de fichiers ou l'interaction avec les protocoles binaires. En conséquence, la fonction Unpack () peut analyser la chaîne binaire emballée à des données structurées. Cet article présentera en profondeur comment utiliser pack () et déballer () pour réaliser l'emballage et l'analyse des structures personnalisées, et vous aidera à mieux comprendre son application à travers des exemples spécifiques.
La fonction Pack () emballe une ou plusieurs données dans les chaînes binaires en fonction de la chaîne de format. Les formats courants comprennent:
A : chaîne remplie de NUL (chaîne fixe)
A : chaîne remplie d'espace (chaîne fixe)
C : caractères non signés (1 octet)
C : caractères signés (1 octet)
S : entier court non signé (2 octets)
S : entier court signé (2 octets)
L : non signé long (4 octets)
L : Signé entier long (4 octets)
N : entier long non signé (4 octets, Network Endianness)
N : entier court non signé (2 octets, Network Endianness)
Supposons que nous ayons une définition de structure simple comme suit:
ID utilisateur (entier long non signé, 4 octets)
Statut (caractères non signés, 1 octet)
Équilibre (entier court signé, 2 octets)
Nom (longueur fixe de 10 octets)
Comment emballer ces données avec pack () et l'analyser avec unpack () ?
<?php
// Définir les données
$userId = 123456789;
$status = 1;
$balance = -250;
$name = "Zhang San";
// utiliserpack()Données d'emballage
// Description du format:
// N - utilisateurID,Entiers longs non signés de l'endienne du réseau(4octet)
// C - État,Personnages non signés(1octet)
// s - Équilibre,Entier court signé(2octet)
// a10 - Nom,Longueur fixe10octet,NULremplissage
$packedData = pack('NCsa10', $userId, $status, $balance, $name);
// Imprimez la représentation hexadécimale des données binaires emballées,Facile à observer
echo "Données emballées(hexadécimal): " . bin2hex($packedData) . PHP_EOL;
// Simuler la transmission des données sur le réseau,Déballer après avoir reçu
$unpackedData = unpack('NuserId/Cstatus/sbalance/a10name', $packedData);
// Imprimer le tableau déballé
print_r($unpackedData);
?>
Données emballées(hexadécimal): 075bcd1501ff06e58f5a696e67
Array
(
[userId] => 123456789
[status] => 1
[balance] => -250
[name] => Zhang San
)
Le format N représente un entier long non signé (4 octets) et adopte l'ordre des octets du réseau (Big Endian), qui est souvent utilisé pour la transmission de données multiplateformes pour assurer l'ordre cohérent des octets.
C signifie des caractères non signés, 1 octet, pour les champs d'état.
S représente un entier court signé (2 octets), où l'équilibre est négatif et les valeurs signées sont prises en charge.
A10 représente une chaîne de longueur fixe. Lorsque la chaîne est insuffisante, elle sera remplie de \ 0 .
La fonction Deback () déballait les données via la même chaîne de format, renvoie un tableau associatif et les noms de clés peuvent être personnalisés pour faciliter l'accès à chaque champ.
Problème de commande d'octets <br> Si les données doivent être transmises entre différentes architectures de machine, il est recommandé d'utiliser le format en Endian ( N , N ) du réseau pour assurer la compatibilité entre les petites et petites extrémités.
Rembourrage de cordes <br> L'utilisation du format A remplira la partie insuffisante de la chaîne avec \ 0 , tandis que un va remplir l'espace. Choisissez la méthode de remplissage appropriée pour éviter les erreurs d'analyse.
Longueur de données fixe <br> Le format d'emballage doit être strictement cohérent avec le format de déballage, en particulier la longueur de chaîne doit être la même, sinon l'analyse de données entraînera des erreurs.
Compétences de débogage <br> Vous pouvez utiliser bin2hex () pour convertir les données binaires en hexadécimal pour faciliter le débogage et la vérification.
Si vous devez emballer un paquet de données, qui contient un champ URL, et que la pièce de nom de domaine doit être remplacée par m66.net , vous pouvez d'abord traiter la chaîne, puis l'emballer: