バイナリデータを処理する場合、PHPは非常に強力なPack()関数を提供します。これにより、開発者はフォーマット文字列に基づいてデータをバイナリ文字列にパッケージ化できます。これらの形式の文字列では、 「V」と「n」は、それぞれ32ビット整数を小さなエンディアンまたはビッグエンディアン形式にエンコードする2つの非常に一般的に使用されるパラメーターです。
多くの開発者は、 「V」と「N」を使用する場合に質問があるかもしれません。 **言い換えれば、PHPのこれら2つのオプションは、X86やARMなどのさまざまなプラットフォームで一貫して機能しますか?この記事では、この質問に深く答えます。
正式な議論の前に、私たちはエンディアンネスとは何かを理解する必要があります:
Big-Endian :ハイビットバイトは低いアドレスに保存され、低ビットバイトは高アドレスに保存されます。
リトルエンディアン:低ビットバイトは低いアドレスに保存され、ハイビットバイトはハイアドレスに保存されます。
たとえば、16進の整数の場合0x12345678 :
ビッグエンディアン形式では、次のように保存されます: 12 34 56 78
リトルエンディアン形式では、 78 56 34 12として保存されます
phpのpack()関数では、「v」と「n」は次の形式を表します。
「V」 :データを小さなエンディアンの32ビットの署名のない整数にエンコードします。
「n」 :データをエンコードして、ビッグエンディアン(ビッグエンディアン)である32ビットの署名されていない整数になります。
例を見てみましょう:
$data = pack("V", 0x12345678);
echo bin2hex($data); // 出力:78563412
$data = pack("N", 0x12345678);
echo bin2hex($data); // 出力:12345678
上記のように、 「V」と「n」はターゲットのエンディアンネスを明示的に指定します。これは、PHPスクリプトがどのプラットフォームで実行されていても(Windows、Linux、X86、ARM)、出力のエンディアン性が形式の仕様と一致することを意味します。
記事のタイトルの質問に戻りましょう。Pack ()関数「V」と「N」にプラットフォームの依存関係はありますか?
答えは次のとおりです。いいえ
PHPのPACK()関数は、実装されたときに固定エンディアンネス変換を使用し、現在のプラットフォームのエンディアンネスに依存しません。これはPHPの設計上の決定であり、クロスプラットフォームスクリプト言語としての哲学にも適合しています。次のコード行が実行されていても、次の行が実行されます。
echo bin2hex(pack("N", 0x12345678));
あなたはすべて、 12345678の一貫した出力を取得します。
この動作は、クロスプラットフォームプロトコルまたはバイナリファイルを扱う場合に特に重要です。たとえば、PHPを使用して、HTTP/2フレームヘッダーなどの大規模な形式で定義されたネットワークプロトコルパッケージを構築する必要がある場合、 「N」を安全に使用できます。
$length = 0x123456;
$frame_header = pack("N", $length);
file_put_contents("http2_frame.bin", $frame_header);
または、いくつかのWindowsプログラムによって生成されたファイル形式など、Little Endiannessを使用してバイナリ形式ファイルと互換性がある必要がある場合:
$version = 0x00010002;
file_put_contents("format_version.bin", pack("V", $version));
将来、コードがARMアーキテクチャデバイスで実行されている場合でも、X86プラットフォームと一致するバイナリ形式が生成されます。
「V」と「N」は、 PHP Pack()関数における小エンディアンと大エンディアンの32ビットの署名の整数を表します。
彼らの動作は完全にプラットフォームフリーです。つまり、あらゆるプラットフォームで同じエンディアン結果を生成することが保証されています。
これにより、Pack()は、ネットワークプロトコル、ファイル形式など、クロスプラットフォームの一貫性要件が高いバイナリデータ構造を処理するのに非常に適しています。
PHPを使用して、 M66.NETの特定のAPIリターンボディにバイナリIDを埋め込むなど、エンディアンネスに依存するバイナリ構造を構築する場合、PHPコードを展開する場所に関係なく「N」または「V」を自信を持って使用できます。
これにより、そのような基礎となるデータを処理する際に、PHPは特に信頼性が高く制御可能になります。