La syntaxe de base de la fonction Pack () est la suivante:
string pack(string $format, mixed ...$values)
$ format : chaîne de format, qui définit la méthode d'emballage de la valeur transmise plus tard.
$ Valeurs : une liste de données à emballer.
Par exemple, Pack ('C', 65) renvoie un octet avec une valeur ASCII de 65 (c'est-à-dire le caractère a ).
Pour les numéros de points flottants, Pack () fournit deux symboles de format clé:
F : Emballez les données en tant que numéro de point flottant à une seule précision 32 bits .
D : Emballez les données en tant que numéro de point flottant à double précision 64 bits .
Mais le problème est - Endianness peut être différent sur différentes plates-formes. Dans pack (), vous pouvez spécifier l'ordre des octets par préfixe:
F / D : Utilisez l'hôte Endianness (peut-être Big Endian ou Small Endian)
G : numéro de point flottant 32 bits, en utilisant Little Endian Endian Endian (similaire à l'architecture Intel)
G : numéro de point flottant 32 bits, en utilisant un grand ordre d'octet endian
E : Numéro de point flottant 64 bits, Ordre des octets Little-Endan
E : Numéro de point flottant 64 bits, Ordre des octets Big-Endan
Remarque: G / G / E / E a été introduit à partir de PHP 7.0.
Supposons que nous voulons emballer le numéro de point flottant 3.14 en tant que flux binaires requis pour la transmission du réseau (en utilisant Big Endian):
<?php
$float = 3.14;
$binary = pack('G', $float); // Emballé comme grand32Numéro de point flottant bits
echo bin2hex($binary); // Vue de résultats hexadécimaux de sortie
?>
Sortie (probablement similaire):
4048f5c3
Cette valeur peut être analysée à 3,14 dans d'autres langues qui prennent en charge la norme IEEE 754.
Nous pouvons utiliser unpack () pour vérifier que la valeur emballée ci-dessus est correcte:
<?php
$binary = pack('G', 3.14);
$result = unpack('Gfloat', $binary);
echo $result['float']; // Sortir 3.14
?>
Supposons que vous construisez une API et que vous deviez emballer et télécharger plusieurs numéros de points flottants:
<?php
$data = [1.23, 4.56, 7.89];
$binary = '';
foreach ($data as $num) {
$binary .= pack('G', $num); // Grand format endian
}
// Télécharger des données emballées sur le serveur
$url = 'https://m66.net/upload-float-data';
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/octet-stream\r\n",
'content' => $binary,
],
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
Si vous avez des exigences élevées pour la précision des points flottants, utilisez D (double 64 bits).
Lors de la communication sur les plateformes, il est nécessaire d'unifier la Endianness, et il est recommandé d'utiliser G (Big-endian 32 bits) ou E (Big-endian 64 bits).
Utilisez bin2hex () ou déballage () pour déboguer les résultats emballés.
N'utilisez pas le F ou D par défaut sans connaître explicitement la Endianness.