Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung und Beispiele der PHP-Pack()-Funktion

Ausführliche Erklärung und Beispiele der PHP-Pack()-Funktion

WBOY
WBOYOriginal
2016-08-08 09:24:261487Durchsuche

Das Packen und Entpacken ist in gewöhnlichen Programmen wirklich nicht leicht zu erkennen, aber wenn Sie PHP schon vor langer Zeit zum Generieren von Excel verwendet haben, wissen Sie es. Der Header seines Excel ist voll
Ich habe dieses Ding kürzlich wieder verwendet, als ich versuchte, mit C zu interagieren, also musste ich noch einmal einen Blick darauf werfen. Tatsächlich war es C, der von mir verlangte, einen Baotou zu haben. . . Tatsächlich sind reine Saiten auch gut. Warum muss man sich ein Brötchen zulegen? Wirklich verwirrt...
Das Handbuch enthält Einführungen zum Ein- und Auspacken, diese sind jedoch alle auf Englisch. . .

Jede Sprache mit Socket-Operationsfunktionen verfügt über eine Funktion, die speziell für die Paketassemblierung verwendet wird, und PHP ist keine Ausnahme! > Ich verwende PHP schon seit langer Zeit, habe aber selten die Gelegenheit, PHP zum Ausführen einiger Binäroperationen zu verwenden. Kürzlich habe ich mit PHP einen Socket-Client geschrieben, um eine Verbindung zu einem in der Sprache C++ entwickelten Spieleserver herzustellen. Serverseitige Entwickler verwenden eine Binärform, um das Format des Protokolls zu definieren. Das Protokollformat ist wie folgt:
Baot-Header (2 Byte) + Verschlüsselung (1 Byte) + Befehlscode (2 Byte) + Frame-Inhalt 1. Der Inhalt des Paket-Headers ist die Länge von der aufgezeichnete Frame-Inhalt;
2. Verschlüsselung: 0 bedeutet keine Verschlüsselung, 1 bedeutet Verschlüsselung. 3 Der Befehlscode ist das Symbol zur Identifizierung des Serverbefehls Funktionen in der C-Sprache und geben Binärpakete gemäß den Protokollregeln zurück. Anschließend habe ich diese Methoden in eine Reihe von Erweiterungsfunktionen kompiliert, die PHP verwenden kann.



Zurück zum Thema: In diesem Artikel wird die Verwendung der Pack- und Unpack-Methoden erläutert. Das offizielle PHP-Handbuch enthält zu wenige Beispiele, um es leicht verständlich zu machen, insbesondere die Verwendung von Formatierungsparametern. Chinesische Erklärung der Parameter für die Übertragung:
Vorlagenzeichen packen/entpacken Zeichenbedeutunga Eine mit Leerzeichen gefüllte BytefolgeA Eine mit Leerzeichen gefüllte Bytefolge
b Ein Bit Eine Zeichenfolge, die Die Reihenfolge der Bits in jedem Byte ist aufsteigend B Eine Bitfolge, die Reihenfolge der Bits in jedem Byte ist absteigend c Ein vorzeichenbehafteter Zeichenwert (8-Bit-Ganzzahl)
C Ein vorzeichenloser Zeichenwert (8- (Bit-Ganzzahl)-Wert; für Unicode siehe U
d Eine Gleitkommazahl mit doppelter Genauigkeit im nativen Format
f Eine Gleitkommazahl mit einfacher Genauigkeit im nativen Format
h Eine hexadezimale Zeichenfolge, niedrige Ziffer zuerst
H Eine hexadezimale Zeichenfolge, hohe Ziffer zuerst
i Ein vorzeichenbehafteter Ganzzahlwert, natives Format
I Ein vorzeichenloser Ganzzahlwert, natives Format
l Ein vorzeichenbehafteter Long-Wert, immer 32 Bit
L Ein vorzeichenloser Long-Wert , immer 32 Bits
n Eine 16-Bit kurze, „Netzwerk“-Bytereihenfolge (Big End zuerst)
N Eine 32-Bit kurze Ganzzahl, „Netzwerk“-Bytereihenfolge (Big End zuerst)
p Ein Zeiger auf eine nullterminierte Zeichenfolge
P Ein Zeiger auf eine Zeichenfolge fester Länge
q Ein Zeiger auf eine nullterminierte Zeichenfolge ein vorzeichenbehafteter Quad-Wert (64-Bit-Ganzzahl)
Q ein vorzeichenloser Quad-Wert (64-Bit). ganzzahliger) Wert
s ein vorzeichenbehafteter kurzer ganzzahliger Wert, immer 16 Bits
S ein vorzeichenloser kurzer ganzzahliger Wert, immer 16 Bits,
Die Bytereihenfolge hängt vom Maschinenchip ab

u Ein uncodierter string
U Eine Unicode-Zeichennummer
v Eine „VAX“-Bytereihenfolge (Little Endian) Eine 16-Bit-Kurz-Ganzzahl in „VAX“-Bytereihenfolge (Little Endian)
w Eine BER-komprimierte Ganzzahl
x Ein Nullbyte (in Vorwärtsrichtung) Ein Byte ignorieren) [, gemischte $args [, gemischte $...]] )Einige Regeln:
1 Auf jeden Buchstaben kann ein folgen Zahl, die count angibt. Wenn count ein * ist, bedeutet dies den Rest von allem.
2. Wenn Sie weniger Parameter angeben, als $format erfordert, geht Pack davon aus, dass alle fehlenden Werte null sind. Wenn Sie mehr Parameter angeben, als $format erfordert, werden die zusätzlichen Parameter ignoriert.
Die folgenden Beispiele erleichtern das Verständnis:



PHP-Code

  1. Über Pack:
  2. Der erste Teil unten packt den numerischen Wert in Bytes:
  3. $out = pack("CCCC", 65, 66, 67, 68); $out ist gleich "ABCD"
  4. $out = pack("C4", 65, 66, 67, 68);
  5. Die Folgendes bewirkt dasselbe für Unicode-Schleifenbuchstaben:
  6. $foo
  7. = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);
  8. Das Folgende macht etwas Ähnliches und fügt etwas Leerraum hinzu:
  9. $out
  10. = pack(" CCxxCC", 65, 66, 67, 68); # $out ist gleich "AB
  11. $data = "010000020007";
  12. entpacken ("Sint1/Cchar1/Sint2/Cchar2",$data);
  13. ## array('int1'=>1, 'char1'=>'0','int2'=>2, 'char2'=>7);
  14. Letzter Artikel Das eingangs erwähnte Protokoll verwendet pack/unpack. Der Beispielprogrammcode lautet:
  15. pack(
  16. 'SCSa32a32'
  17. ,0x0040, 0x00 , 0x0006, $username, $passwd ); ,$lastmessage
  18. );
  19. Lernmaterialien: http://blog .net/jojobb3138688/archive/2007/05/07/1598609.aspxMein obiger Inhalt stammt von: http://blog.sina.com.cn/s/blog_3eba8f1c0100nq9r.html, mir geht es jetzt gut Aufgebraucht. HeiheiEs gibt weitere Referenzmaterialien:http://bbs.phpchina.com/thread-104492-1-1.htmlhttp://hi.baidu.com/chinetman/item/ f78a71d847e7d638e2108fda Das Obige stellt die detaillierte Erklärung und Beispiele der PHP-Pack()-Funktion vor, einschließlich des relevanten Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn