PHPのバイトオーダー変換方法

藏色散人
リリース: 2023-03-04 20:02:02
オリジナル
3626 人が閲覧しました

php バイトオーダー変換方法: 1. "htons" メソッドを使用して unsigned short 型をホスト順序からネットワーク順序に変換します; 2. "htonl" を使用してホスト順序から "unsigned long" 型を変換しますネットワーク順序へ ネットワークシーケンスなど

PHPのバイトオーダー変換方法

推奨: 「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 position
ログイン後にコピー

Network 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート