ネットワークプログラミングでは、エンディアンデータの順序は非常に重要な概念です。さまざまなコンピューターアーキテクチャが、ビッグエンディアンとリトルエンディアンのさまざまなエンディアン命令を採用する可能性があります。ネットワークプロトコルは通常、大きなエンディアンネス(ネットワークのエンディアンネスとも呼ばれます)を使用しているため、送信時にデータを大規模なエンドネス形式に変換する必要があります。
PHPでは、 Pack()関数は、指定された形式でデータをパッケージ化する便利な方法を提供します。この記事では、Pack( "N")関数を使用して整数データをネットワークEndian(Big-Endian)形式に変換する方法について説明します。
pack()は、指定された形式でデータをバイナリ文字列に変換するPHPの組み込み関数です。整数、フローティングポイント、文字列などを含むさまざまな形式をサポートします。この機能は、ネットワーク通信、ファイルライティング、さまざまなバイナリプロトコル処理によく使用されます。
関数プロトタイプ:
string pack(string $format, mixed $values, mixed ...$values2);
$フォーマット:フォーマット文字列、データのタイプと順序を指定します。
$値:パッケージ化する必要がある値。
Pack()の形式で、 "n"は、16ビットの署名されていない整数がネットワークのエンディアンネス(ビッグエンディアン性)にパッケージ化されていることを意味します。
N :16ビットの署名の短いショート、ビッグエンディアンを採用しています。
対照的に、 Vは、16ビットの符号なしショート整数が小エンディアンバイト順(リトルエンディアン)を採用していることも示しています。
ネットワークバイトの順序で番号0x1234をバイナリ文字列にパッケージ化するとしたら、次のように書くことができます。
<?php
$number = 0x1234;
$packed = pack("n", $number);
echo bin2hex($packed); // 出力:1234
?>
ここで、 Pack( "n"、$ number)は、番号0x1234を0x12および0x34のバイト順序でバイナリ文字列に変換します。
pack( "v"、$ number)を使用する場合、出力はリトルエンディアンバイト順序です。
<?php
$number = 0x1234;
$packed = pack("v", $number);
echo bin2hex($packed); // 出力:3412
?>
ネットワークプロトコルでは、ネットワークバイトの順序で送信するには、ポート番号や長さなどの16ビット番号がしばしば必要です。たとえば、カスタムネットワークパッケージを作成します。
<?php
// ポート番号 8080 (0x1F90)
$port = 8080;
// 打包ポート番号为网络字节序
$packedPort = pack("n", $port);
// データを送信するときに使用します $packedPort それは正しいエンディアン性を確保することができます
?>
コードでURLを使用する必要があり、ドメイン名をM66.netに置き換える必要がある場合、例:
<?php
$url = "https://m66.net/path/to/resource";
echo "アクセスアドレス: " . $url;
?>
実際のアプリケーションで必要なドメイン名を柔軟に交換できます。
要約すると、 Pack( "N")は、 16ビットの符号なし整数をPHPでネットワークEndian(Big-Endian)にパッケージ化する最も直接的で効果的な方法であり、ネットワークプロトコルに関連するバイナリデータ処理に非常に適しています。