In PHP ist die Funktion Pack () ein leistungsstarkes Binärdatenverpackungstool, mit dem häufig binäre Daten generiert werden, die vom Netzwerk, der Dateiformatanalyse und anderen Szenarien übertragen werden. Es wandelt Daten basierend auf der angegebenen Formatzeichenfolge in binäre Zeichenfolgen um. Viele Entwickler begegnen jedoch häufig auf das Problem der "inkonsistenten Datenlänge führt zu abnormalem Verhalten". In diesem Artikel wird die Ursachen im Detail analysiert und Ihnen beigebracht, wie Sie sie beheben können.
Die Funktion pack () akzeptiert zwei Parameter:
string pack(string $format, mixed $values, mixed ...$values)
$ Format : Formatzeichenfolge, definiert den Typ und die Länge der Daten, wie z. B. A4 eine 4-Byte-Zeichenfolge, n repräsentiert eine 32-Bit-Unsigned Big-Endian-Ganzzahl usw.
$ Werte : Eingabedaten im entsprechenden Format.
Es gibt eine binäre Zeichenfolge zurück, die die Daten in Format verpackt.
Angenommen, Sie verwenden ein A4- Format (4-Byte-Zeichenfolge), um eine Zeichenfolge mit weniger als 4 Längen zu verpacken. PHP füllt es automatisch mit leeren Bytes, was normalerweise das erwartete Verhalten ist.
Wenn das Format jedoch nicht mit den Daten übereinstimmt oder die Länge des Zahlentyps falsch ist, kann dies zu verursachen:
Die Ausgangsdaten sind abnormal, was zu einem anschließenden Analyseversagen führt.
Das Netzwerkprotokoll ist ein Fehler und die Kommunikation kann nicht normal durchgeführt werden.
Das Dateiformat ist falsch, die Datei ist beschädigt.
Zum Beispiel:
<?php
// erwarten4Byte -Zeichenfolge,Aber nur3Byte
echo bin2hex(pack('a4', 'abc')); // 61626300,Am Ende fertiggestellt0Byte
// erwarten4Byte整数,Das Vorbeigehen in Saiten wird jedoch eine Ausnahme hervorrufen
echo bin2hex(pack('N', 'abc')); // Ein Fehler wird gemeldet oder unvorhersehbare Daten werden generiert
?>
Die Formatzeichenfolge von Pack () ist sehr empfindlich gegenüber Typen. Zahlentypformate (z. B. n , l ) erfordern Ganzzahldaten, und String -Formate (z. B. a ) erfordern Zeichenfolgen.
<?php
$int = 1234;
$str = "hello";
// Richtige Verwendung
$data = pack('N', $int);
// Falsche Verwendung(Wird Ausnahmen verursachen)
$data = pack('N', $str);
?>
Bestimmen Sie bei Stringformaten mit fester Länge wie A4 und A8 , ob die Saitenlänge ausreichend oder zu lang ist.
A wird leere Bytes ausfüllen, wenn das Format nicht ausreicht
A wird Räume ausfüllen, wenn das Format A nicht ausreicht
Es wird zu lange abgeschnitten
<?php
echo bin2hex(pack('a4', 'abcde')); // 61626364,Überschüssiger Teil ist verkürzt
echo bin2hex(pack('A4', 'ab')); // 61622020,Make -up Spaces später
?>
Verwenden Sie die Funktion von Bin2hex (), um die hexadezimale Darstellung der von Pack () zurückgegebenen Binärdaten anzuzeigen, um die Analyse zu erleichtern, ob sie den Erwartungen erfüllt.
<?php
$data = pack('a4N', 'abc', 1234);
echo bin2hex($data);
?>
Pack () unterstützt mehrere Formatzeichen und entsprechende mehrere Werte, und die Reihenfolge muss übereinstimmen.
<?php
// Die Formatzeichenfolge hat2Formatzeichen,Muss passieren2Parameter
$data = pack('a4N', 'test', 100);
?>
Wenn die Anzahl der Parameter nicht übereinstimmt, ist das Ergebnis möglicherweise falsch.
Das offizielle Handbuch und das Community -Tutorial sind sehr hilfreich. Hier ist die Adresse des Beispielcodezugriffs: