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