Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Methode zur Konvertierung der Bytereihenfolge

PHP-Methode zur Konvertierung der Bytereihenfolge

藏色散人
藏色散人Original
2020-08-20 09:58:523605Durchsuche

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.

PHP-Methode zur Konvertierung der Bytereihenfolge

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!

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