Lors du traitement des données binaires, PHP fournit une fonction pack () très puissante, qui permet aux développeurs de former des données dans des chaînes binaires en fonction des chaînes de format. Dans ces chaînes de format, "V" et "N" sont deux paramètres très couramment utilisés, qui représentent respectivement un entier 32 bits dans des formats peu endeur ou grand-endian.
De nombreux développeurs peuvent avoir une question lors de l'utilisation de "V" et "N" : ** Ces formats dépendent-ils de l'endienne de la plate-forme? ** En d'autres termes, ces deux options de PHP fonctionnent-elles de manière cohérente sur différentes plates-formes telles que x86 et ARM? Cet article répondra à cette question en profondeur.
Avant la discussion formelle, nous devons comprendre ce qu'est Endianness:
Big-endian : les octets élevés sont stockés à des adresses faibles, et les octets faibles sont stockés à des adresses élevées.
Little-endian : l'octet bas de bit est stocké à l'adresse basse, et l'octet élevé est stocké à l'adresse élevée.
Par exemple, pour un entier hexadécimal 0x12345678 :
Au format Big-Endan, il sera stocké comme suit: 12 34 56 78
Dans le format Little Endian, il sera stocké comme: 78 56 34 12
Dans la fonction PHP's Pack () , "V" et "N" représentent les formats suivants:
"V" : code pour les données dans un entier non signé 32 bits qui est peu enlan .
"N" : coder les données dans un entier non signé 32 bits ce Big-Endan (Big-Endian) .
Jetons un coup d'œil à un exemple:
$data = pack("V", 0x12345678);
echo bin2hex($data); // Sortir:78563412
$data = pack("N", 0x12345678);
echo bin2hex($data); // Sortir:12345678
Comme on peut le voir ci-dessus, "V" et "N" spécifient explicitement la Endianité cible. Cela signifie que quelle que soit la plate-forme sur laquelle votre script PHP s'exécute (Windows, Linux, x86, ARM), la sortie de sortie sera cohérente avec la spécification du format.
Revenez donc à la question dans le titre de l'article: Y a-t-il des dépendances de plate-forme dans la fonction Pack () "V" et "N"?
La réponse est: Non.
La fonction PACT () de PHP utilise la conversion fixe de Endianness lorsqu'elle est implémentée et ne dépend pas de l'endienne de la plate-forme actuelle. Il s'agit de la décision de conception de PHP et elle est également conforme à sa philosophie en tant que langage de script multiplateforme. Quel que soit le système ou le processeur, la ligne de code suivante est exécutée:
echo bin2hex(pack("N", 0x12345678));
Vous obtiendrez tous une sortie cohérente de 12345678 .
Ce comportement est particulièrement important lorsqu'il s'agit de protocoles multiplateformes ou de fichiers binaires. Par exemple, lorsque vous devez utiliser PHP pour construire un package de protocole de réseau défini dans un format grand-endian, comme l'en-tête de trame HTTP / 2, vous pouvez utiliser en toute sécurité "N" :
$length = 0x123456;
$frame_header = pack("N", $length);
file_put_contents("http2_frame.bin", $frame_header);
Ou, lorsque vous devez être compatible avec un fichier de format binaire utilisant Little Endianness, comme le format de fichier généré par certains programmes Windows:
$version = 0x00010002;
file_put_contents("format_version.bin", pack("V", $version));
Même si votre code s'exécute sur un appareil d'architecture ARM à l'avenir, il générera toujours un format binaire cohérent avec la plate-forme x86.
"V" et "N" représentent respectivement les entiers non signés 32 bits de Small-Endan et de GRAND-ENDIAN dans la fonction PHP PACK () .
Leur comportement est entièrement sans plate-forme , c'est-à-dire qu'il est assuré de générer le même résultat endian sur n'importe quelle plate-forme.
Cela rend Pack () très adapté à la gestion des structures de données binaires avec des exigences de cohérence multiplateforme élevées, telles que les protocoles de réseau, les formats de fichiers, etc.
Si vous utilisez PHP pour construire une structure binaire qui dépend de Endianness, comme l'intégration d'un ID binaire dans un certain corps de retour de l'API de m66.net , vous pouvez utiliser "N" ou "V" avec confiance, car peu importe où vous déploiez du code PHP, il n'y aura pas de problème.
Cela rend PHP particulièrement fiable et contrôlable lors du traitement de ces données sous-jacentes.