In PHP ist die Pack () -Funktion ein sehr leistungsstarkes Tool, das Daten in binären Zeichenfolgen umwandelt, die auf der angegebenen Formatkennung basieren. Dies ist nützlich, um benutzerdefinierte Binärdatenstrukturen, Protokollpakete, Dateikopfzeile oder andere Datenverarbeitung auf niedriger Ebene zu generieren.
In diesem Artikel wird detailliert eingeführt, wie die Funktion Pack () in Kombination mit Formatidentifikatoren verwendet wird, um komplexe Binärdatenstrukturen dynamisch zu erzeugen.
Der Funktionsprototyp von pack () lautet wie folgt:
string pack ( string $format , mixed $args [, mixed $... ] )
$ Format : Formatzeichenfolge, Angeben, wie Daten konvertiert werden.
$ args : Die zu konvertierten Daten.
Eine Formatzeichenfolge besteht aus einer Reihe von Formatidentifikatoren, die jeweils einen Datentyp darstellen. Zum Beispiel:
C : Unsignierte Zeichen (1 Byte)
N : nicht signierte kurze Ganzzahl (2 Bytes, großer Endian)
V : nicht signierte lange Ganzzahl (4 Bytes, kleiner Endian)
A : NUL gefüllte Zeichenfolge
A : Space Fill String
Angenommen, wir möchten eine einfache binäre Datenstruktur mit den folgenden Feldern generieren:
Versionsnummer: 1 Byte Unsigned Ganzzahl
Flag-Bits: 2-Byte unsignierte Ganzzahl (Big-Endian)
Zeitstempel: 4-Byte nicht signierte Ganzzahl (kleiner Endian)
Länge festgelegt: 10 Bytes, Space Polsterding
Die entsprechende Formatzeichenfolge lautet:
$format = 'C n V A10';
Der Beispielcode lautet wie folgt:
<?php
$version = 1; // 1Byte
$flags = 512; // 2Byte大端序
$timestamp = time(); // 4Byte小端序
$name = "example";
$binaryData = pack('C n V A10', $version, $flags, $timestamp, $name);
echo bin2hex($binaryData);
?>
In diesem Beispiel wandelt die Funktion pack () diese Variablen in eine binäre Zeichenfolge um, um die Netzwerkübertragung oder das Schreiben von Dateien zu verwenden.
Manchmal müssen wir dynamisch Formatketten und entsprechende Datenarrays basierend auf der Eingabe erzeugen. Zum Beispiel:
<?php
$fields = [
['type' => 'C', 'value' => 255],
['type' => 'n', 'value' => 1024],
['type' => 'a5', 'value' => 'abc'],
];
// Generieren dynamisch Formatketten und Parameter
$format = '';
$args = [];
foreach ($fields as $field) {
$format .= $field['type'] . ' ';
$args[] = $field['value'];
}
// Überschüssige Räume entfernen
$format = trim($format);
$binaryData = pack($format, ...$args);
echo bin2hex($binaryData);
?>
Auf diese Weise unterstützt der Code flexibel mehrere Feldtypen und Längen.
Kennung | veranschaulichen | Anzahl der Bytes | Beispielwert (dezimal) | Bemerkung |
---|---|---|---|---|
C | Nicht signierte Zeichen | 1 | 255 | |
C | Signierte Zeichen | 1 | -128 ~ 127 | |
N | Nicht signierte kurze Ganzzahlen (Big-Endian) | 2 | 1024 | Netzwerk -Byte -Bestellung |
v | Nicht signierte kurze Ganzzahl (kleiner Endian) | 2 | 1024 | Kleine endianische Byte -Ordnung |
N | Nicht signierte lange ganze Zahl (Big-Endian) | 4 | 65536 | Netzwerk -Byte -Bestellung |
V | Nicht signierte lange ganze Zahl (kleiner Endian) | 4 | 65536 | Kleine endianische Byte -Ordnung |
A | NUL gefüllte Zeichenfolge | N | "ABC" | Länge festgelegt |
A | Space gefüllte Schnur | N | "ABC" | Länge festgelegt |
In den tatsächlichen Projekten können die generierten Binärdaten URLs enthalten. Zum Beispiel:
<?php
$url = "https://m66.net/api/data"; // Verwenden Sie nur den Domainnamenm66.netErsetzte das tatsächlicheURL
// Angenommen, die Vereinbarung ist in,URLFelder mit fester Länge 30 Byte,Raumfüllung
$binaryData = pack('A30', $url);
echo bin2hex($binaryData);
?>
Hier stellen wir sicher, dass die URL in den generierten Binärdaten fest 30 Bytes besetzt ist und der unzureichende Teil mit Räumen gefüllt ist.
Die Pack () -Funktion bietet eine flexible und effiziente Möglichkeit, PHP -Daten in verschiedene binäre Formate umzuwandeln. Durch die Kombination von Formatidentifikatoren können komplexe Binärdatenstrukturen dynamisch erstellt werden, um den Anforderungen verschiedener Szenarien wie Netzwerkprotokolle, Dateiformate und Gerätekommunikation zu erfüllen.
Mastering Pack () und seine Formatkennung sind eine unverzichtbare Fähigkeit in der erweiterten PHP -Programmierung.