En PHP, lors du traitement des données binaires, les fonctions Pack () et Unleback () sont deux outils très pratiques. Ils peuvent convertir les données en chaînes binaires dans un format spécifique, ou analyser les chaînes binaires en données structurées. Ceci est très critique pour implémenter la sérialisation et la désérialisation des structures de données personnalisées ou l'interaction avec les protocoles et les formats de fichiers sous-jacents.
Cet article expliquera en détail comment combiner les fonctions Pack () et Unpack () pour implémenter l'analyse et la conversion des structures de données personnalisées.
pack (format, args ...) : emballez le paramètre args dans une chaîne binaire en fonction de la chaîne de format .
Démacker (format, données) : déballer les données de chaîne binaire dans un tableau associatif en fonction de la chaîne de format .
La chaîne de format est composée de code de format, qui définit le type de données, la longueur et l'endienne. Par exemple:
C : caractères non signés (1 octet)
N : entier endian endian de Big-Endan endian 16 bits non signé
V : entier endian endian petit-endian 32 bits non signé
R : chaîne remplie de NUL
R : chaîne remplie d'espace
Pour plus de codes de format, veuillez vous référer au document PHP officiel .
Supposons que nous définissons une structure de données simple comme suit:
Nom de champ | taper | Longueur (octets) | illustrer |
---|---|---|---|
taper | uint8 | 1 | Identification du type de données |
longueur | uint16 | 2 | Longueur de données ultérieure |
charge utile | Ruisseau d'octets | longueur | Contenu de données spécifique |
Nos objectifs sont:
Emballez la structure de données PHP en données binaires qui répondent au format ci-dessus;
Les données binaires sont analysées et les champs de type, de longueur et de charge utile sont extraits.
<?php
function packData(int $type, string $payload): string {
$length = strlen($payload);
// 'C' - 1Octet entier non signé
// 'n' - 2Octet Big Endiger endian non signé
// 'a*' - Chaîne de toute longueur,NULremplissage(这里不需要remplissage)
return pack('Cn', $type, $length) . $payload;
}
// test
$type = 5;
$payload = "Hello, World!";
$binaryData = packData($type, $payload);
echo bin2hex($binaryData);
?>
Ici pack ('cn', $ type, $ longueur) emballe d'abord le type et la longueur séparément, puis épisser la charge utile de chaîne d'origine.
Pendant l'analyse, retirez d'abord le type et la longueur de la partie fixe, puis interceptez la charge utile restante en fonction de la longueur .
<?php
function unpackData(string $binaryData): array {
// Avant la première version3Octets,type(1octet) + length(2octet大端)
$header = unpack('Ctype/nlength', substr($binaryData, 0, 3));
$type = $header['type'];
$length = $header['length'];
// Retirer le restepayloaddonnées
$payload = substr($binaryData, 3, $length);
return [
'type' => $type,
'length' => $length,
'payload' => $payload,
];
}
// test
$data = $binaryData; // Supposons d'en hautpackDataSortir
$result = unpackData($data);
var_dump($result);
?>
Intégrez les deux fonctions ci-dessus pour implémenter la sérialisation et la désérialisation des structures personnalisées:
<?php
function packData(int $type, string $payload): string {
$length = strlen($payload);
return pack('Cn', $type, $length) . $payload;
}
function unpackData(string $binaryData): array {
$header = unpack('Ctype/nlength', substr($binaryData, 0, 3));
$type = $header['type'];
$length = $header['length'];
$payload = substr($binaryData, 3, $length);
return [
'type' => $type,
'length' => $length,
'payload' => $payload,
];
}
// Exemple d'utilisation
$type = 10;
$payload = "PHP pack/unpack Démo";
$packed = packData($type, $payload);
echo "二进制données(hex):" . bin2hex($packed) . "\n";
$unpacked = unpackData($packed);
echo "Résultats de l'analyse:\n";
print_r($unpacked);
?>
Résultats en cours:
二进制données(hex):0a0017... (hexContenu binaire codé)
Résultats de l'analyse:
Array
(
[type] => 10
[length] => 23
[payload] => PHP pack/unpack Démo
)
pack () et unback () sont des outils puissants pour le traitement des données binaires, prenant en charge plusieurs types de données et la conversion endian;
Pour analyser les structures de données personnalisées, vous pouvez d'abord définir un format d'en-tête fixe, puis utiliser les opérations de chaîne pour traiter les champs de longueur variable;
Combiné avec le traitement binaire, PHP peut également facilement gérer les protocoles de réseau, l'analyse du format de fichier et d'autres scénarios.