Position actuelle: Accueil> Derniers articles> Utilisez pack () pour implémenter la sérialisation des données binaires

Utilisez pack () pour implémenter la sérialisation des données binaires

M66 2025-06-05

Dans PHP, la fonction Pack () est utilisée pour emballer les données en chaînes binaires dans le format spécifié. Ceci est utile lors de la gestion des transferts de réseau, de l'écriture de fichiers et des interactions avec C ou d'autres langues de bas niveau. Cet article expliquera en détail l'utilisation de la fonction Pack () et combinera des exemples pour illustrer comment emballer les données au format binaire.

Pack () Fonction Introduction

La syntaxe de base de Pack () est la suivante:

 string pack(string $format, mixed $values, mixed ...$values)
  • $ Format : spécifie le format des données, composé d'un ou plusieurs codes de format.

  • $ VALEUR : La valeur à emballer peut être plusieurs paramètres.

La valeur de retour est une chaîne binaire emballée dans le format spécifié.

Codes de format commun

Code de format décrire Exemple
un Chaîne remplie de caractères nul pack ('A4', 'ABC')
UN Chaîne remplie d'espace pack ('A4', 'ABC')
c Caractères signés (1 octet) Pack ('C', 65)
C Caractères non signés (1 octet) Pack ('C', 65)
s Entier court signé (2 octets) pack ('s', 1234)
S Entier court non signé (2 octets) pack ('s', 1234)
je Entier signé (longueur de mot de machine) pack ('i', 123456)
je Entier non signé (longueur de mot de machine) pack ('i', 123456)
l Signé entier long (4 octets) Pack ('L', 123456)
L Entier long non signé (4 octets) Pack ('L', 123456)
f Numéro de point flottant (4 octets) pack ('f', 3.14)
d Numéro de point flottant à double précision (8 octets) pack ('D', 3.14)
n Entier court non signé (Endian Big-endian 16 bits) pack ('n', 1234)
N Entier long non signé (Endian Big-endian 32 bits) pack ('n', 1234)

Exemple d'analyse

1. Crises et entiers d'emballage

 <?php
// Emballer une longueur4chaîne et une32Bit non signé entier endian
$packed = pack('a4N', 'test', 123456789);
echo bin2hex($packed);
?>

Ici, «A4» signifie emballer une chaîne de longueur 4, la partie insuffisante est remplie de caractères NUL; «N» signifie emballer un entier grand-endian non signé 32 bits. Bin2hex () convertit le contenu binaire en hexadécimal pour une visualisation facile.

2. Utilisez Pack () pour créer des packages de protocole réseau

Supposons que vous deviez construire un paquet de réseau simple, y compris le type de commande (1 octet) et la longueur de données (4 octets Big Endian), puis le corps de données:

 <?php
$command = 1;               // Type de commande,1octet
$data = "Hello, m66.net!";  // Corps de données
$length = strlen($data);    // Durée des données

// 打包Type de commande和Durée des données
$header = pack('CN', $command, $length);

// Épisser des paquets de données complètes
$packet = $header . $data;

// Représentation hexadécimale du package de sortie
echo bin2hex($packet);
?>

Dans le code ci-dessus, le type de commande de package «C» (1 octet entier non signé) et la longueur des données du package «n» (entier Big-endian de 4 octets). Les corps de données sont épissés tels quels.

3. Exemple d'utilisation de pack () et de déball () pour se convertir

 <?php
$number = 65535;
$packed = pack('n', $number);  // 按大端octet序打包为16Entier non signé
echo 'Packed data: ' . bin2hex($packed) . PHP_EOL;

$unpacked = unpack('nvalue', $packed);  // Déballage
echo 'Unpacked value: ' . $unpacked['value'] . PHP_EOL;
?>

résumé

Pack () est un outil puissant pour manipuler les données binaires, particulièrement adaptées à la programmation réseau et au traitement des données sous-jacentes. En utilisant le code de format, vous pouvez contrôler avec précision la disposition des octets et le type de données.