PHP-Byte-Reihenfolge-Konvertierungsmethode: 1. Verwenden Sie die Methode „htons“, um den unsigned short-Typ von der Host-Reihenfolge in die Netzwerk-Reihenfolge umzuwandeln. 2. Verwenden Sie „htonl“, um den „unsigned long“-Typ von der Host-Reihenfolge in die Netzwerk-Reihenfolge umzuwandeln. usw.
Empfohlen: „PHP-Video-Tutorial“
PHP-Host-Byte-Reihenfolge und Netzwerk-Byte-Reihenfolge
Wenn Sie PHP zum Schreiben eines Socket-Programms verwenden, müssen Sie auch auf die Host-Byte-Reihenfolge und das Netzwerk achten Byte-Reihenfolge Die Konvertierung
Host-Byte-Reihenfolge ist das, was wir normalerweise Big-Endian- und Little-Endian-Modus nennen: Verschiedene CPUs haben unterschiedliche Byte-Reihenfolge-Typen. Diese Byte-Reihenfolge bezieht sich auf die Reihenfolge, in der Ganzzahlen im Speicher gespeichert werden. Big-Endian und Little-Endian. Die Standarddefinitionen von Big-Endian und Little-Endian werden wie folgt zitiert:
a) Little-Endian bedeutet, dass die niederwertigen Bytes am unteren Adressende des Speichers und die höherwertigen Bytes am unteren Adressende des Speichers angeordnet sind das High-Adress-Ende des Speichers.
b) Big-Endian bedeutet, dass die höherwertigen Bytes am unteren Adressende des Speichers und die niederwertigen Bytes am oberen Adressende des Speichers angeordnet sind.
Beispiel: Die Speichermethode des Doppelworts 0x01020304 (DWORD) im Speicher
内存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04
Die Reihenfolge der Netzwerkbytes bezieht sich auf ein in TCP/IP angegebenes Datendarstellungsformat, das nichts mit dem spezifischen CPU-Typ, dem Betriebssystem usw. zu tun hat. Dadurch wird sichergestellt, dass Daten bei der Übertragung zwischen verschiedenen Hosts korrekt interpretiert werden können. Die Netzwerk-Byte-Reihenfolge verwendet Big-Endian-Sortierung. Die Bytereihenfolge ist, wie der Name schon sagt, die Reihenfolge, in der Daten, die größer als ein Byte sind, im Speicher gespeichert werden. Bei Daten mit einem Byte gibt es kein Problem mit der Reihenfolge.
Um den BSD-Socket zu konvertieren, stehen die folgenden vier Konvertierungsfunktionen zur Verfügung: htons konvertiert den vorzeichenlosen Kurztyp von der Host-Sequenz in die Netzwerksequenz.
htonl konvertiert den vorzeichenlosen langen Typ von der Host-Sequenz in die Netzwerksequenz.
Ntohs konvertiert die vorzeichenlose Short-Typ-Konvertierung von Netzwerkreihenfolge in Host-Reihenfolge
ntohl Konvertieren Sie den vorzeichenlosen Long-Typ von Netzwerkreihenfolge in Host-Reihenfolge
In Systemen, die Little Endian verwenden, konvertieren diese Funktionen die Endian-Reihenfolge. In Systemen, die Big Endian-Typen verwenden, werden diese Funktionen dies tun als leere Makros definiert werden Bei der Entwicklung von Netzwerkprogrammen oder der plattformübergreifenden Entwicklung sollte außerdem darauf geachtet werden, dass nur eine Bytereihenfolge verwendet wird. Andernfalls führen unterschiedliche Interpretationen der beiden Parteien zu Fehlern.
PHP Es gibt keine Funktionen und htonl-Funktionen. Während der Netzwerkkommunikation können Sie über
string pack ( string $format [, mixed $args [, mixed $... ]] ) array unpack ( string $format , string $data )
format kodieren und dekodieren. Darunter kann das Format die folgenden Werte annehmen:
Code Description a NUL-padded string A SPACE-padded string h Hex string, low nibble first H Hex string, high nibble first c signed char C unsigned char s signed short (always 16 bit, machine byte order) S unsigned short (always 16 bit, machine byte order) n unsigned short (always 16 bit, big endian byte order) v unsigned short (always 16 bit, little endian byte order) i signed integer (machine dependent size and byte order) I unsigned integer (machine dependent size and byte order) l signed long (always 32 bit, machine byte order) L unsigned long (always 32 bit, machine byte order) N unsigned long (always 32 bit, big endian byte order) V unsigned long (always 32 bit, little endian byte order) f float (machine dependent size and representation) d double (machine dependent size and representation) x NUL byte X Back up one byte Z NUL-padded string (new in PHP 5.5) @ NUL-fill to absolute position
Netzwerkkommunikation
Jetzt müssen Sie beispielsweise Daten über das PHP-Paket an senden Server, um sich anzumelden. Wenn Sie nur den Benutzernamen (bis zu 30 Byte) und das Passwort (festgelegt auf 32 Byte nach MD5) angeben müssen, können Sie das folgende Datenpaket erstellen (dazu müssen Sie natürlich die Spezifikationen des Datenpakets im Voraus mit dem Server aushandeln). . In diesem Beispiel Netzwerk-Byte-Reihenfolge-Kommunikation):
Paketstruktur:
字段 字节数 说明 包头 定长 每一个通信消息必须包含的内容 包体 不定长 根据每个通信消息的不同产生变化
Die Details des Headers lauten wie folgt:
字段 字节数 类型 说明 pkg_len 2 ushort 整个包的长度,不超过4K version 1 uchar 通讯协议版本号 command_id 2 ushort 消息命令ID result 2 short 请求时不起作用;请求返回时使用
Natürlich können in der Praxis verschiedene Überprüfungen erforderlich sein. Der Einfachheit halber werden in diesem Artikel nur die gängigen Arbeitsabläufe und Verarbeitungsmethoden aufgeführt.
Anmelden (Befehl 1001 ausführen)
字段 字节数 类型 说明 用户名 30 uchar[30] 登录用户名 密码 32 uchar[32] 登录密码
Der Header hat eine feste Länge. Durch Berechnung kann festgestellt werden, dass der Header 7 Bytes belegt und sich der Header vor dem Paketkörper befindet. Beispielsweise muss sich der Benutzer Chen Yihui anmelden und das Passwort lautet 123456. Der Code lautet wie folgt:
<?php $version = 1; $result = 0; $command_id = 1001; $username = "陈一回"; $password = md5("123456"); // 构造包体 $bin_body = pack("a30a32", $username, $password); // 包体长度 $body_len = strlen($bin_body); $bin_head = pack("nCns", $body_len, $version, $command_id, $result); //result为什么使用了主机字节序 $bin_data = $bin_head . $bin_body; // 发送数据 // socket_write($socket, $bin_data, strlen($bin_data)); // socket_close($socket);
Das obige ist der detaillierte Inhalt vonPHP-Methode zur Konvertierung der Bytereihenfolge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!