Dans PHP, pack () et unback () se trouvent une paire de fonctions puissantes qui sont souvent utilisées pour convertir entre les données binaires et les formats lisibles par l'homme. Cet article vous guidera sur la façon d'utiliser ces deux fonctions pour créer un convertisseur de données bidirectionnel simple pour réaliser la sérialisation et la désérialisation des structures de données, ce qui convient au stockage de fichiers, à la transmission du réseau et à d'autres scénarios.
pack () : Emballez une ou plusieurs valeurs dans les chaînes binaires en fonction du format spécifié.
unback () : analyse la valeur de la chaîne binaire dans le format spécifié.
Les codes de format de ces deux fonctions prennent en charge plusieurs types de données, tels que les entiers, les types de points flottants, les chaînes, etc. Les caractères de format commun sont:
Format des caractères | signification | Occupant des octets |
---|---|---|
C | Char non signé | 1 octet |
n | Entier court non signé (Big Endian) | 2 octets |
N | Unsigned Long (Big Endian) | 4 octets |
un | NUL REMPLIER CHILLE | N octets |
Supposons que nous devons emballer et déballer les données de la structure suivante:
ID utilisateur (entier non signé de 4 octets)
Niveau utilisateur (1 octet)
S'il faut activer (valeurs booléennes, représentées par 0 et 1)
Nom d'utilisateur (chaîne de longueur fixe, 20 octets)
Ce que nous voulons réaliser, c'est:
Utilisez Pack () pour emballer ces champs dans une chaîne binaire.
Utilisez unback () pour reconstituer les données d'origine de cette chaîne.
class DataConverter {
const FORMAT = 'Nid/Clevel/Cactive/a20username';
public static function encode($data) {
return pack(
self::FORMAT,
$data['id'],
$data['level'],
$data['active'] ? 1 : 0,
$data['username']
);
}
public static function decode($binary) {
$result = unpack(self::FORMAT, $binary);
$result['active'] = $result['active'] === 1;
$result['username'] = rtrim($result['username'], "\0"); // Retirer NUL remplissage
return $result;
}
}
$data = [
'id' => 123456,
'level' => 5,
'active' => true,
'username' => 'm66user'
];
$binary = DataConverter::encode($data);
echo bin2hex($binary) . PHP_EOL;
$parsed = DataConverter::decode($binary);
print_r($parsed);
Exemple de sortie (représentation hexadécimale):
0001e24005016d363675736572000000000000000000000000
Array
(
[id] => 123456
[level] => 5
[active] => 1
[username] => m66user
)
Bien que ce convertisseur soit simple, il peut s'étendre à des scénarios d'utilisation plus complexes:
Des paquets de protocole réseau, tels que la construction et l'analyse des données de communication de socket.
Sérialisation et désérialisation des fichiers binaires.
Utilisé lors du stockage de données compactes (comme le cache, les appareils intégrés).
Par exemple, vous pouvez envoyer les données codées à une interface distante:
file_put_contents("https://m66.net/api/upload", $binary);
Ou charger les données du décodage à distance: