Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie Pack () und pack (), um den bidirektionalen Konverter zu implementieren

Verwenden Sie Pack () und pack (), um den bidirektionalen Konverter zu implementieren

M66 2025-05-28

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.

Grundkonzepte

  • 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

Szenarioeinstellung: Eine einfache Datenstruktur

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:

  1. Verwenden Sie Pack () , um diese Felder in eine binäre Zeichenfolge zu verpacken.

  2. Verwenden Sie pack () , um die Originaldaten aus dieser Zeichenfolge erneut zu festigen.

Schreiben Sie eine Konverterklasse

 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;
    }
}

Beispiel für die Nutzung

 $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
)

Anwendungsszenario -Erweiterung

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: