Aktueller Standort: Startseite> Neueste Artikel> Kapitulieren Sie eine universelle Verpackungsfunktion, die mehrere Formate unterstützt

Kapitulieren Sie eine universelle Verpackungsfunktion, die mehrere Formate unterstützt

M66 2025-05-29

In der PHP -Entwicklung müssen wir manchmal mehrere Daten im angegebenen Format in binäre Zeichenfolgen verpacken, was für die Netzwerkübertragung oder den Speicher von Dateien geeignet ist. Die von PHP bereitgestellte Packfunktion kann diese Anforderung erfüllen, erfordert jedoch eine Übergabe in komplexen Formatketten, und die Formate verschiedener Szenarien variieren stark. In diesem Artikel wird vorgestellt, wie die Packfunktion verwendet wird, um eine allgemeine Verpackungsfunktion zu verkörpern, die mehrere Formate zur Verbesserung der Wiederverwendbarkeit und Flexibilität des Codes unterstützt.


1. Einführung in die Packfunktion

Die grundlegende Syntax der Packfunktion lautet:

 string pack(string $format, mixed ...$values)
  • $ format gibt das Format an, wie z. B. C darstellt unsignierte Zeichen, n repräsentiert 16-Bit-Big-Endian Endian Endian Integer usw.

  • $ values ​​sind Daten im entsprechenden Format.

Zum Beispiel Paket zwei nicht signierte Charaktere und eine 16-Bit-Big-Endian-Ganzzahl:

 $data = pack('CCn', 0x01, 0x02, 0x1234);

2. Ideen zum Entwerfen allgemeiner Verpackungsfunktionen

Die Funktion, die wir zusammenfassen möchten:

  • Akzeptiert eine Formatzeichenfolge und das entsprechende Wertearray.

  • Verpacken Sie automatisch die Werte eins nach eins gemäß der Formatzeichenfolge.

  • Unterstützt gemeinsame Formatypen und ist für die Erweiterung bequem.

  • Behandeln Sie Fehler, die Parameter und Formate nicht übereinstimmen.

Beispielfunktion Signatur:

 function universalPack(string $format, array $values): string

Code -Beispiele implementieren

Das Folgende ist eine grundlegende Implementierung, die C , N , N , A usw. unterstützt: Formate:

 function universalPack(string $format, array $values): string {
    $result = '';
    $formatLength = strlen($format);
    $valueIndex = 0;

    for ($i = 0; $i < $formatLength; $i++) {
        $char = $format[$i];
        $repeat = 1;

        // Erkennen, ob es Duplikate gibt,wiea4、C2Warten
        if (isset($format[$i + 1]) && ctype_digit($format[$i + 1])) {
            $repeat = (int)$format[$i + 1];
            $i++;
        }

        for ($r = 0; $r < $repeat; $r++) {
            if (!isset($values[$valueIndex])) {
                throw new InvalidArgumentException("Die Anzahl der Werte stimmt nicht mit dem Format überein");
            }
            $value = $values[$valueIndex];
            $valueIndex++;

            switch ($char) {
                case 'C': // Nicht signierte Zeichen
                    $result .= pack('C', $value);
                    break;
                case 'n': // 16Big Big Endian Byte Order
                    $result .= pack('n', $value);
                    break;
                case 'N': // 32Big Big Endian Byte Order
                    $result .= pack('N', $value);
                    break;
                case 'a': // NULZeichenfolge füllen,Länge durchrepeatEntscheiden
                    if ($repeat < 1) {
                        throw new InvalidArgumentException("aDas Format muss in Länge angegeben werden");
                    }
                    $str = str_pad(substr($value, 0, $repeat), $repeat, "\0");
                    $result .= $str;
                    // aFormatverarbeitung alle auf einmalrepeat,valueIndexKein Inkrement
                    $valueIndex--;
                    break;
                default:
                    throw new InvalidArgumentException("Nicht unterstützte Formatzeichen: $char");
            }
        }
    }

    return $result;
}

Iv. Beispiele verwenden

Angenommen, Sie möchten ein Datenpaket verpacken, die Struktur lautet:

  • 1 Byte -Befehlsnummer ( c )

  • 2 Byte -Datenlänge ( n )

  • 4 Byte -Daten -ID ( n )

  • 10 Byte -Dateninhalt (String, A10 )

Aufrufen Beispiel:

 $command = 0x01;
$length = 14;
$dataId = 123456;
$content = "hello";

$packed = universalPack('CnNa10', [$command, $length, $dataId, $content]);
echo bin2hex($packed);

Die Ausgabe ist:

 01000e0001e24068656c6c6f0000000000

5. Zusammenfassung

  • Packfunktionen sind sehr leistungsstark, aber das Format und das Wert sind bei direkter Verwendung von Fehlern anfällig.

  • Kapitulieren Sie eine universelle Universalpack -Funktion, um die Verpackung von Multi-Format-Daten zu vereinfachen.

  • Funktionen können weiterhin entsprechend den tatsächlichen Bedürfnissen, z. B. der Unterstützung von mehr Formaten, der Unterstützung von Kleinanordnung usw., verbessert werden.

  • In den tatsächlichen Projekten kann die Entpackfunktion auch mit der Entpackfunktion kombiniert werden, um die Peer -Auspackfunktion zu erzielen.