Aktueller Standort: Startseite> Neueste Artikel> Die richtige Art, Pack () zu verwenden, um schwimmende Punktzahlen zu verpacken

Die richtige Art, Pack () zu verwenden, um schwimmende Punktzahlen zu verpacken

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.