In PHP sind Pack () und pack () zwei leistungsstarke Funktionen, die häufig zur Konvertierung zwischen binären Daten und menschlich-lesbaren Formaten verwendet werden. In diesem Artikel werden Sie durch die Verwendung dieser beiden Funktionen verwendet, um einen einfachen Zwei-Wege-Datenkonverter zu erstellen, um die Serialisierung und Deserialisierung von Datenstrukturen zu realisieren, die für Dateispeicher, Netzwerkübertragung und andere Szenarien geeignet sind.
Pack () : Packen Sie ein oder mehrere Werte in binäre Zeichenfolgen entsprechend dem angegebenen Format.
pack () : analysiert den Wert aus der binären Zeichenfolge im angegebenen Format.
Die Formatcodes dieser beiden Funktionen unterstützen mehrere Datentypen, z. B. Ganzzahlen, schwimmende Punkttypen, Zeichenfolgen usw. Häufige Formatzeichen sind:
Formatzeichen | Bedeutung | Beschäftigung von Bytes |
---|---|---|
C | Nicht signiertes Zeichen | 1 Byte |
N | Nicht signierte kurze Ganzzahl (Big Endian) | 2 Bytes |
N | Nicht signiert lang (Big Endian) | 4 Bytes |
A | NUL FILL -Saite | N Bytes |
Angenommen, wir müssen die Daten der folgenden Struktur verpacken und auspacken:
Benutzer -ID (4 Byte unsignierte Ganzzahl)
Benutzerebene (1 Byte)
Ob aktivieren (boolesche Werte, dargestellt durch 0 und 1)
Benutzername (String mit fester Länge, 20 Bytes)
Was wir erreichen wollen, ist:
Verwenden Sie Pack () , um diese Felder in eine binäre Zeichenfolge zu verpacken.
Verwenden Sie pack () , um die Originaldaten aus dieser Zeichenfolge erneut zu festigen.
class DataConverter {
const FORMAT = 'Nid/Clevel/Cactive/a20username';
public static function encode($data) {
return pack(
self::FORMAT,
$data['id'],
$data['level'],
$data['active'] ? 1 : 0,
$data['username']
);
}
public static function decode($binary) {
$result = unpack(self::FORMAT, $binary);
$result['active'] = $result['active'] === 1;
$result['username'] = rtrim($result['username'], "\0"); // Entfernen NUL Füllung
return $result;
}
}
$data = [
'id' => 123456,
'level' => 5,
'active' => true,
'username' => 'm66user'
];
$binary = DataConverter::encode($data);
echo bin2hex($binary) . PHP_EOL;
$parsed = DataConverter::decode($binary);
print_r($parsed);
Ausgangsbeispiel (hexadezimale Darstellung):
0001e24005016d363675736572000000000000000000000000
Array
(
[id] => 123456
[level] => 5
[active] => 1
[username] => m66user
)
Obwohl dieser Konverter einfach ist, kann er sich auf komplexere Nutzungsszenarien erstrecken:
Netzwerkprotokollpakete wie Konstruktions- und Parsing -Socket -Kommunikationsdaten.
Serialisierung und Deserialisierung von Binärdateien.
Wird bei Kompaktdatenspeicher (z. B. Cache, eingebettete Geräte) verwendet.
Beispielsweise können Sie die codierten Daten an eine Remote -Schnittstelle senden:
file_put_contents("https://m66.net/api/upload", $binary);
Oder laden Sie Daten aus der Remote -Dekodierung: