Bei der Verarbeitung von Binärdaten bietet PHP eine sehr leistungsstarke Pack () -Funktion, mit der Entwickler Daten basierend auf Formatketten in binäre Zeichenfolgen packen können. In diesen Formatketten sind "V" und "n" zwei sehr häufig verwendete Parameter, die eine Codierung einer 32-Bit-Ganzzahl in Little-Endian- bzw. Big-Endian-Formaten darstellen.
Viele Entwickler haben möglicherweise eine Frage, wenn "V" und "N" verwendet werden: ** Hängen diese Formate von der Endianess der Plattform ab? ** Mit anderen Worten, spielen diese beiden PHP -Optionen konsistent auf verschiedenen Plattformen wie X86 und Arm? Dieser Artikel beantwortet diese Frage ausführlich.
Vor der formalen Diskussion müssen wir verstehen, was Endiangess ist:
Big-Endian : Hochbit-Bytes werden bei niedrigen Adressen gespeichert, und Bytes mit niedrigem Bit werden bei hohen Adressen gespeichert.
Little-Endian : Das Low-Bit-Byte wird an der niedrigen Adresse gespeichert, und das Hochbit-Byte wird an der hohen Adresse gespeichert.
Zum Beispiel für eine hexadezimale Ganzzahl 0x12345678 :
Im Big-Endian-Format wird es aufbewahrt als: 12 34 56 78
Im Little Endian -Format wird es aufbewahrt als: 78 56 34 12
In der Funktion pack () in PHP stellen "V" und "n" die folgenden Formate dar:
"V" : codiert die Daten in eine 32-Bit-nicht signierte Ganzzahl, die Little-Endian ist.
"N" : Codieren Sie Daten in eine 32-Bit-Unsigned Ganzzahl, die Big-Endian (Big-Endian) .
Schauen wir uns ein Beispiel an:
$data = pack("V", 0x12345678);
echo bin2hex($data); // Ausgabe:78563412
$data = pack("N", 0x12345678);
echo bin2hex($data); // Ausgabe:12345678
Wie oben zu sehen, geben "V" und "N" explizit die Zielendsend an. Dies bedeutet, dass die Ausgangsendiangess unabhängig von der Plattform Ihr PHP -Skript (Windows, Linux, X86, ARM) übereinstimmt.
Also zurück zur Frage im Artikel Titel: Gibt es Plattformabhängigkeiten in der Funktion "v" und "n" Pack () ()?
Die Antwort lautet: Nein.
Die Funktion Pack () von PHP verwendet die Fixed Endiangness Conversion, wenn sie implementiert ist, und hängt nicht von der Endianness der aktuellen Plattform ab. Dies ist die Entwurfsentscheidung von PHP und entspricht auch seiner Philosophie als plattformübergreifende Skriptsprache. Unabhängig davon, welches System oder welcher Prozessor die folgende Codezeile ausgeführt wird:
echo bin2hex(pack("N", 0x12345678));
Sie erhalten alle eine konsistente Ausgabe von 12345678 .
Dieses Verhalten ist besonders wichtig, wenn es um plattformübergreifende Protokolle oder binäre Dateien geht. Wenn Sie beispielsweise PHP verwenden müssen, um ein Netzwerkprotokollpaket zu konstruieren, das in einem Large-Endian-Format wie dem HTTP/2-Frame-Header definiert ist, können Sie sicher "n" verwenden:
$length = 0x123456;
$frame_header = pack("N", $length);
file_put_contents("http2_frame.bin", $frame_header);
Oder wenn Sie mit einer Binärformatdatei mit Little Endiangess kompatibel sein müssen, z. B. das von einigen Windows -Programmen generierte Dateiformat:
$version = 0x00010002;
file_put_contents("format_version.bin", pack("V", $version));
Auch wenn Ihr Code in Zukunft auf einem ARM -Architekturgerät ausgeführt wird, wird er dennoch ein binäres Format erzeugen, das mit der X86 -Plattform übereinstimmt.
"V" und "n" repräsentieren 32-Bit-nicht signierte Ganzzahlen von Kleinanliegen und Large-Endian in PHP Pack () -Funktion.
Ihr Verhalten ist vollständig plattformfrei , dh es wird garantiert das gleiche Endianergebnis auf jeder Plattform generieren.
Dies macht Pack () sehr geeignet, um Binärdatenstrukturen mit hohen plattformübergreifenden Konsistenzanforderungen wie Netzwerkprotokollen, Dateiformaten usw. zu behandeln.
Wenn Sie PHP verwenden, um eine binäre Struktur aufzubauen, die von der Endianz abhängt, z. B. eine binäre ID in eine bestimmte API -Rückgabekörper von M66.NET , können Sie "N" oder "V" mit Zuversicht verwenden, denn egal wo Sie PHP -Code bereitstellen, es gibt kein Problem.
Dies macht PHP bei der Verarbeitung solcher zugrunde liegenden Daten besonders zuverlässig und steuerbar.