Aktueller Standort: Startseite> Neueste Artikel> Wie kann ich die schwimmenden Punktzahlen in PHP richtig verpacken? Eine detaillierte Erklärung ist hier

Wie kann ich die schwimmenden Punktzahlen in PHP richtig verpacken? Eine detaillierte Erklärung ist hier

M66 2025-06-04

1. Einführung in die Funktion pack ()

Die grundlegende Syntax der Funktion pack () lautet wie folgt:

 string pack(string $format, mixed ...$values)
  • $ Format : Formatzeichenfolge, die die Verpackungsmethode des in später übergebenen Werts definiert.

  • $ Werte : Eine Liste der zu verpackten Daten.

Zum Beispiel gibt Pack ('C', 65) ein Byte mit einem ASCII -Wert von 65 (d. H. Zeichen A ) zurück.


2. Symbole für das Floating Point Number Format

Für schwimmende Punktzahlen bietet Pack () zwei wichtige Formatsymbole:

  • F : Verpacken Sie die Daten als 32-Bit-Schwimmpunktzahl mit einer Präzision .

  • D : Verpacken Sie die Daten als 64-Bit-schwimmende Punktnummer mit doppelter Präzision .

Das Problem ist jedoch, dass Endiantness auf verschiedenen Plattformen unterschiedlich sein kann. In Pack () können Sie Byte -Bestellung nach Präfix angeben:

  • F / D : Verwenden Sie Host Endiangess (vielleicht Big Endian oder Small Endian)

  • G : 32-Bit-schwimmende Punktzahl unter Verwendung des kleinen Endian Endian Endian (ähnlich wie die Intel-Architektur)

  • G : 32-Bit-schwimmende Punktzahl unter Verwendung der Big Endian Byte Order

  • E : 64-Bit-schwimmende Punktzahl, Little-Endian Byte Order

  • E : 64-Bit-schwimmende Punktzahl, Big-Endian-Byte-Order

Hinweis: G / G / E / E wurde ab PHP 7.0 eingeführt.


3. Beispiel: Verpackung schwimmende Punktzahlen in binäre Saiten

Nehmen wir an, wir möchten die schwebende Punktnummer 3.14 als Binärströme verpacken, die für die Netzwerkübertragung erforderlich sind (mit Big Endian):

 <?php
$float = 3.14;
$binary = pack('G', $float); // Wie Big-End gepackt32Bit schwimmende Punktzahl
echo bin2hex($binary); // Ausgabe von Hexadezimalergebnisansicht
?>

Ausgabe (wahrscheinlich ähnlich):

 4048f5c3

Dieser Wert kann in anderen Sprachen, die den IEEE 754 -Standard unterstützen, auf 3.14 zurückgezogen werden.


4. Ausprüfungen

Wir können pack () verwenden, um zu überprüfen, ob der oben verpackte Wert korrekt ist:

 <?php
$binary = pack('G', 3.14);
$result = unpack('Gfloat', $binary);
echo $result['float']; // Ausgabe 3.14
?>

5. Praktische Anwendung: Schwimmpunktzahlen werden verpackt und hochgeladen

Angenommen, Sie erstellen eine API und müssen mehrere schwimmende Punktzahlen verpacken und hochladen:

 <?php
$data = [1.23, 4.56, 7.89];
$binary = '';
foreach ($data as $num) {
    $binary .= pack('G', $num); // Big Endian Format
}

// Laden Sie verpackte Daten auf den Server hoch
$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. Tipps

  • Wenn Sie hohe Anforderungen an die Genauigkeit der Gleitpunkte haben, verwenden Sie D (64-Bit-Doppel).

  • Bei der Kommunikation über Plattformen ist es notwendig, die Endiantheit zu vereinen, und es wird empfohlen, G (32-Bit-Big-Endian) oder E (64-Bit-Big-Endian) zu verwenden.

  • Verwenden Sie Bin2hex () oder pack (), um die verpackten Ergebnisse zu debuggen.

  • Verwenden Sie die Standardeinstellung für D oder D nicht, ohne die Endiantheit explizit zu kennen.