Position actuelle: Accueil> Derniers articles> La bonne façon d'utiliser pack () pour emballer les numéros de point flottants

La bonne façon d'utiliser pack () pour emballer les numéros de point flottants

M66 2025-06-04

1. Fonction Introduction à Pack ()

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 ).


2. Symboles de format de numéro de point flottant

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.


3. Exemple: emballage des numéros de point flottants en chaînes binaires

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.


4. Déballage Vérification

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
?>

5. Application pratique: les numéros de points flottants sont emballés et téléchargés

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);

6. Conseils

  • 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.