PHP開発では、データパッケージ、ネットワーク伝送、またはファイルライティングのために、整数をバイナリ文字列形式に変換する必要がある場合があります。 PHPの組み込みパック()関数は、このタスクを達成するための強力なツールです。この記事では、 Pack()関数の基本的な使用法を紹介し、整数をバイナリ文字列に変換する方法に焦点を当て、実用的なアプリケーションシナリオを説明する例を示します。
Pack()関数は、データをバイナリ文字列にパッケージ化するために使用され、その構文は次のとおりです。
string pack(string $format, mixed ...$values)
$フォーマット:フォーマット文字列。後続のパラメーターがどのようにパッケージ化されるかを示します。
$値:パッケージ化するデータ。
Pack()は、さまざまなフォーマットされた文字をサポートしています。この記事では、整数のパッケージに使用されるいくつかのキーワードに焦点を当てています。
整数を扱うとき、ここにいくつかの一般的な形式文字があります:
C :署名されていない文字(1バイト、範囲0〜255)
N :署名されていない短い整数(2バイト、ネットワークのエンディアンネス)
V :署名されていない短い整数(2バイト、ホストバイト順序)
N :署名されていない長い整数(4バイト、ネットワークのエンディアンネス、ビッグエンディアンネス)
V :署名されていない長い整数(4バイト、ホストエンディアン、スモールエンディアン)
J :署名されていない64ビット整数(PHP 5.6+サポート)
たとえば、Integer 1234を2バイトネットワークEndiannessバイナリ文字列に変換します。
$binary = pack("n", 1234);
4294967295 (つまり、32ビットの非署名整数の最大値)をネットワークバイト順に変換したい:
$int = 4294967295;
$binary = pack("N", $int);
echo bin2hex($binary); // 出力:ffffffff
ユーザーID(4バイト)、レベル(1バイト)、およびステータス(1バイト)を含むバイナリデータファイルを作成する必要があるとします。
$userId = 1001;
$level = 5;
$status = 1;
$data = pack("NCC", $userId, $level, $status);
file_put_contents("user_data.bin", $data);
生成されたファイルには、埋め込まれたシステムまたはクロスプラットフォームデータ交換に最適な、正確な7バイトのバイナリコンテンツが含まれます。
たとえば、ゲームサーバー通信プロトコルを開発する場合、クライアントは次の構造でデータパケットを送信する必要があります。
baotou(2バイト、 0xabcdに固定)
データの長さ(2バイト)
ユーザーID(4バイト)
トークン文字列(変数長)
このように構築できます。
$header = 0xABCD;
$userId = 12345;
$token = "abc123token";
$length = 4 + strlen($token);
$packet = pack("nnN", $header, $length, $userId) . $token;
// サーバーアドレスに送信します,例えば:http://m66.net/api/receive_packet
サーバーを受信した後、データを復元するために()unpack() 。
Endianの問題:プラットフォームまたはネットワーク全体で通信する場合、一貫性を確保するために、 N (Big Endian)またはV (Little Endian)形式を使用するように注意してください。
タイプ範囲制限:整数値が指定されたフォーマット文字の許容範囲内にあることを確認し、それ以外の場合はオーバーフローまたは切り捨てが発生する可能性があります。
unpack() : pack()およびunpack()で使用します。ペアで使用されます。ペアでは、エンコードとデコードに便利です。
PACK()関数を使用すると、PHPプログラマーは整数を簡単にバイナリ文字列に変換し、効率的なデータパッケージを実現できます。これは、基礎となるプロトコルを扱う、ファイル形式の生成、または非PHPシステムとの通信で特に重要です。フォーマット文字を使用する習熟度は、PHPの基礎となる処理に習熟するための重要なステップです。