Aktueller Standort: Startseite> Neueste Artikel> Kombinieren Sie pack () und pack () zur Implementierung der benutzerdefinierten Datenstrukturanalyse

Kombinieren Sie pack () und pack () zur Implementierung der benutzerdefinierten Datenstrukturanalyse

M66 2025-05-27

Bei der Verarbeitung von Binärdaten sind die Funktionen von Pack () und pack () zwei sehr praktische Werkzeuge. Sie können Daten in einem bestimmten Format in binäre Zeichenfolgen umwandeln oder binäre Zeichenfolgen in strukturierte Daten analysieren. Dies ist sehr kritisch für die Implementierung der Serialisierung und Deserialisierung von benutzerdefinierten Datenstrukturen oder zur Interaktion mit zugrunde liegenden Protokollen und Dateiformaten.

In diesem Artikel wird ausführlich erläutert, wie Pack () und auspack () Funktionen kombiniert werden, um die Analyse und Konvertierung von benutzerdefinierten Datenstrukturen zu implementieren.


1. Grundlegende Einführung in Pack () und pack () Funktionen

  • Pack (Format, Argumente ...) : Packen Sie den Parameter Args in eine binäre Zeichenfolge gemäß der Formatzeichenfolge ein.

  • Auspacken (Format, Daten) : Entpacken Sie die Binärstringdaten in ein assoziatives Array entsprechend der Formatzeichenfolge.

Die Formatzeichenfolge besteht aus dem Formatcode, der den Datentyp, die Länge und die Endiangigkeit definiert. Zum Beispiel:

  • C : Unsignierte Zeichen (1 Byte)

  • N : nicht signiertes 16-Bit-Big-Endian Endian Endian Integer

  • V : Unsigned 32-Bit Little-Endian Endian Endian Integer

  • A : NUL gefüllte Zeichenfolge

  • A : Space Fill String

Weitere Formatcodes finden Sie im offiziellen PHP -Dokument .


2. Definieren Sie ein Beispiel für benutzerdefinierte Datenstruktur

Angenommen, wir definieren eine einfache Datenstruktur wie folgt:

Feldname Typ Länge (Bytes) veranschaulichen
Typ Uint8 1 Datentypidentifikation
Länge Uint16 2 Nachfolgende Datenlänge
Nutzlast Byte -Stream Länge Spezifischer Dateninhalt

Unsere Ziele sind:

  • Verpacken Sie die PHP -Datenstruktur in Binärdaten, die dem obigen Format entsprechen.

  • Die Binärdaten werden analysiert und die Felder vom Typ, Länge und Nutzlast werden extrahiert.


3. Verwenden Sie Pack (), um Daten zu verpacken

 <?php
function packData(int $type, string $payload): string {
    $length = strlen($payload);

    // 'C' - 1Byte unsigned Ganzzahl
    // 'n' - 2Byte unsigned Big Endian Integer
    // 'a*' - String jeglicher Länge,NULFüllung(这里不需要Füllung)
    return pack('Cn', $type, $length) . $payload;
}

// prüfen
$type = 5;
$payload = "Hello, World!";
$binaryData = packData($type, $payload);
echo bin2hex($binaryData);
?>

Hier packt Pack ('CN', $ type , $ Länge ) .


4. Verwenden Sie pack (), um Daten zu analysieren

Nehmen Sie beim Parsen zuerst den Typ und die Länge des Teils der festen Länge heraus und fangen dann die verbleibende Nutzlast entsprechend der Länge ab.

 <?php
function unpackData(string $binaryData): array {
    // Vor der ersten Veröffentlichung3Bytes,type(1Byte) + length(2Byte大端)
    $header = unpack('Ctype/nlength', substr($binaryData, 0, 3));

    $type = $header['type'];
    $length = $header['length'];

    // Nehmen Sie die verbleibenden herauspayloadDaten
    $payload = substr($binaryData, 3, $length);

    return [
        'type' => $type,
        'length' => $length,
        'payload' => $payload,
    ];
}

// prüfen
$data = $binaryData; // Angenommen von obenpackDataAusgabe
$result = unpackData($data);
var_dump($result);
?>

5. Vollständige Beispiele und Beschreibungen

Integrieren Sie die beiden oben genannten Funktionen, um die Serialisierung und Deserialisierung benutzerdefinierter Strukturen zu implementieren:

 <?php

function packData(int $type, string $payload): string {
    $length = strlen($payload);
    return pack('Cn', $type, $length) . $payload;
}

function unpackData(string $binaryData): array {
    $header = unpack('Ctype/nlength', substr($binaryData, 0, 3));
    $type = $header['type'];
    $length = $header['length'];
    $payload = substr($binaryData, 3, $length);
    return [
        'type' => $type,
        'length' => $length,
        'payload' => $payload,
    ];
}

// Beispiel für die Nutzung
$type = 10;
$payload = "PHP pack/unpack Demo";

$packed = packData($type, $payload);
echo "二进制Daten(hex):" . bin2hex($packed) . "\n";

$unpacked = unpackData($packed);
echo "Analyseergebnisse:\n";
print_r($unpacked);

?>

Auslaufergebnisse:

 二进制Daten(hex):0a0017... (hexCodierter binärer Inhalt)
Analyseergebnisse:
Array
(
    [type] => 10
    [length] => 23
    [payload] => PHP pack/unpack Demo
)

6. Zusammenfassung

  • pack () und pack () sind leistungsstarke Tools zur Verarbeitung von Binärdaten, die Unterstützung mehrerer Datentypen und Endian Conversion;

  • Um benutzerdefinierte Datenstrukturen zu analysieren, können Sie zuerst ein festes Headerformat definieren und anschließend String-Operationen verwenden, um Felder mit variabler Länge zu verarbeiten.

  • In Kombination mit der binären Verarbeitung kann PHP auch einfach auch Netzwerkprotokolle, Parsing -Dateiformat und andere Szenarien umgehen.