Position actuelle: Accueil> Derniers articles> Package le résultat du tableau de json_decode () comme données binaires

Package le résultat du tableau de json_decode () comme données binaires

M66 2025-05-31

Dans le développement de PHP, il est souvent nécessaire de coder et de décoder les données, en particulier en ce qui concerne la transmission du réseau ou le stockage de fichiers. JSON_DECODE () est une fonction commune pour analyser les données JSON dans des tableaux ou objets PHP, tandis que la fonction Pack () peut emballer les données en chaînes binaires pour une transmission et un stockage faciles. Cet article expliquera en détail comment emballer les résultats du tableau obtenus par JSON_DECODE () en données binaires à l'aide de Pack () .


1. Comprendre json_decode () et pack ()

  • JSON_DECODE (String $ JSON, bool $ Assoc = true)
    Analyse la chaîne JSON, le deuxième paramètre est vrai et renvoie le tableau associatif, et l'objet est faux .

  • Pack (Format String $, mixte $ args ...)
    Emballez les paramètres en chaînes binaires en fonction des caractères de format. Le caractère de format détermine le type et la longueur de chaque paramètre.

2. Exemples de scène

Supposons qu'il existe les données JSON suivantes:

 {
  "id": 123,
  "temperature": 36.5,
  "status": 1
}

Après avoir utilisé JSON_DECODE () pour le convertir en un tableau, nous espérons utiliser Pack () pour les emballer en données binaires pour une transmission de réseau pratique.


3. Exemple d'explication de code

 <?php
// JSON données
$json = '{"id":123,"temperature":36.5,"status":1}';

// utiliser json_decode Résoudre en tant que tableau associatif
$data = json_decode($json, true);

// Confirmer les résultats de l&#39;analyse
// var_dump($data);

// 假设données格式如下:
// id: 32Entier non signé (N)
// temperature: Numéro de point flottant,32Précision de l&#39;unité (f)
// status: 8Entier non signé (C)

// Avis:pack Non pris en charge 64位Numéro de point flottant格式,只能utiliser单精度或双精度(d)
// Choisissez une seule précision ici(f)

$binary = pack(
    'NfC',           // Format des caractères:N - 32Entiers non signés pour Bit Endianness, f - Numéro de point flottant, C - 8Entier non signé
    $data['id'],
    $data['temperature'],
    $data['status']
);

// 输出二进制données的十六进制表示,Facile à visualiser
echo bin2hex($binary);
?>

4. Description du code

  • N représente un entier Big-endian non signé 32 bits (Network Endian), adapté à la transmission et à la plate-forme multipliée.

  • F représente un numéro de point flottant à une seule précision à 32 bits.

  • C représente un entier non signé 8 bits.

Ici, l'ID est emballé sous forme d'un entier endian de réseau, la température est un numéro de point flottant et l'état est un octet.


5. Déballage Exemple à partir de données binaires

Afin de vérifier l'exactitude de l'emballage, vous pouvez le déballer avec la fonction Unleback () :

 <?php
// 之前打包后的二进制données
$binary = pack('NfC', 123, 36.5, 1);

// Déballage,Format des caractères必须与打包时对应
$unpacked = unpack('Nid/ftemperature/Cstatus', $binary);

print_r($unpacked);
?>

Sortir:

 Array
(
    [id] => 123
    [temperature] => 36.5
    [status] => 1
)

6. Gérer les structures JSON plus complexes

Si JSON contient des tableaux ou des chaînes multidimensionnelles, vous devez d'abord concevoir un format binaire. Les pratiques courantes sont:

  • Les champs de longueur fixe sont emballés dans un format fixe;

  • Les cordes sont emballées en longueur + contenu, telles que Pack ('N', strlen ($ str)). $ str ;

  • Boucle d'emballage de tableau.

Exemple:

 <?php
$json = '{"users":[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]}';
$data = json_decode($json, true);

$binary = '';
foreach ($data['users'] as $user) {
    $id = $user['id'];
    $name = $user['name'];
    $nameLen = strlen($name);
    $binary .= pack('N', $id);          // id 4octet
    $binary .= pack('N', $nameLen);     // Longueur de nom 4octet
    $binary .= $name;                   // Chaîne de noms
}

echo bin2hex($binary);
?>

7. Résumé

  • JSON_DECODE () Parses JSON Strings dans des tableaux PHP;

  • pack () emballe les données en binaire en fonction du format personnalisé;

  • Le format doit être conçu, compte tenu de la longueur et du type du champ, en particulier la chaîne a besoin de ses propres informations de longueur;

  • Combiné avec unback () pour vérifier l'exactitude des données.

Pour des descriptions de format plus détaillées des fonctions de pack , veuillez vous référer à la documentation PHP officielle .