php バイトオーダー変換方法: 1. "htons" メソッドを使用して unsigned short 型をホスト順序からネットワーク順序に変換します; 2. "htonl" を使用してホスト順序から "unsigned long" 型を変換しますネットワーク順序へ ネットワークシーケンスなど
推奨: 「PHP ビデオ チュートリアル 」
php ホスト バイト オーダーとネットワーク バイト オーダー
PHP を使用してソケット プログラムを作成する場合は、ホスト バイト オーダーとネットワーク バイト オーダー間の変換にも注意する必要があります。
ホスト バイト オーダーは、通常ビッグ エンディアンと呼ばれるものです。モード: 異なる CPU には異なるエンディアン タイプがあります。これらのエンディアンは、整数がメモリに格納される順序を指します。これはホスト順序と呼ばれます。ビッグエンディアンとリトルエンディアン。ビッグエンディアンとリトルエンディアンの標準的な定義は次のように引用されます。
a) リトルエンディアンとは、下位バイトがメモリの下位アドレス端に配置され、上位バイトがメモリの下位アドレス端に配置されることを意味します。バイトはメモリの上位アドレス端に配置されます。
b) ビッグエンディアンとは、上位バイトがメモリの下位アドレス端に配置され、下位バイトがメモリの上位アドレス端に配置されることを意味します。
例: メモリ内のダブル ワード 0x01020304 (DWORD) の格納方法
内存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04
ネットワーク バイト オーダーとは、TCP/IP で指定されたデータ表現形式を指します。これは、特定のデータ表現形式に関連しています。 CPU の種類やオペレーティング システムなどとは関係がないため、異なるホスト間でデータを送信するときにデータが正しく解釈されることが保証されます。ネットワークバイトオーダーはビッグエンディアンソートを使用します。バイトオーダーとは、名前のとおり、1 バイトを超えるデータがメモリに格納される順序であり、1 バイトのデータには順序の問題はありません。
bsd ソケットを変換するために、次の 4 つの変換関数が提供されます。
htons は、unsigned short 型をホスト シーケンスからネットワーク シーケンスに変換します。
htonl は、Convert から unsigned short 型を変換します。ホスト順をネットワーク順に変換
ntohs 符号なしショート型をネットワーク順からホスト順に変換
ntohl 符号なしロング型をネットワーク順からホスト順に変換
リトルエンディアンで使用する場合システムの場合、これらの関数はバイト順序を変換します。
ビッグ エンディアン タイプを使用するシステムでは、これらの関数は空のマクロとして定義されます。
注:
1 、ネットワークおよびホスト バイト変換関数: htons ntohs htonl ntohl (s は短い l は長い h はホスト n はネットワーク)
## 2. 異なるオペレーティング システムは異なる CPU で実行され、バイト順序も異なります。 #ネットワーク プログラムやクロスプラットフォーム開発を開発するときは、1 つのバイト オーダーのみが使用されるように注意する必要があります。そうしないと、両者の解釈が異なるとバグが発生します。PHP マージ関数では、 htons および htonl 関数は、ネットワーク通信中にstring pack ( string $format [, mixed $args [, mixed $... ]] ) array unpack ( string $format , string $data )を通じてエンコードおよびデコードできます。 このうち、format は次の値を取ることができます:
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 positionNetwork Communication
たとえば、ログインするには PHP 経由でサーバーにデータ パケットを送信する必要があります。ユーザー名(最大30バイト)とパスワード(md5以降は32バイト固定)のみを提供する必要がある場合は、次のデータパケットを構築できます(もちろん、これにはデータパケットの仕様を事前にサーバーとネゴシエートする必要があります)この例では、ネットワーク バイト オーダー通信): パケット構造:
字段 字节数 说明 包头 定长 每一个通信消息必须包含的内容 包体 不定长 根据每个通信消息的不同产生变化ヘッダーの詳細は次のとおりです:
字段 字节数 类型 说明 pkg_len 2 ushort 整个包的长度,不超过4K version 1 uchar 通讯协议版本号 command_id 2 ushort 消息命令ID result 2 short 请求时不起作用;请求返回时使用もちろん、さまざまな検証が含まれる場合があります。実際には。わかりやすくするために、この記事では一般的なワークフローと処理方法のみをリストします。 ログイン(実行コマンド1001)
字段 字节数 类型 说明 用户名 30 uchar[30] 登录用户名 密码 32 uchar[32] 登录密码ヘッダーは固定長なので、計算するとヘッダーは7バイトを占め、ヘッダーはパッケージ本体の前にあることがわかります。たとえば、ユーザー Chen Yihui がログインする必要があり、パスワードは 123456 で、コードは次のとおりです:
<?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);
以上がPHPのバイトオーダー変換方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。