現在の位置: ホーム> 最新記事一覧> uppack()を使用して、pack()によって生成されたバイナリ文字列を解析します

uppack()を使用して、pack()によって生成されたバイナリ文字列を解析します

M66 2025-05-31

PHPでは、 Pack()およびUnpack()関数は、バイナリデータを処理するための強力なツールです。 Pack()はデータをバイナリ文字列にパッケージ化するために使用され、 Unpack()はバイナリ文字列を元のデータに解析するために使用されます。それらの使用法、特にuppack()を使用してpack()によって生成されたバイナリ文字列を解析する方法の正確な理解は、ネットワーク通信、ファイル操作、バイナリプロトコル処理、その他のシナリオに不可欠です。

1。pack ()unpack()の基本原理

  • pack() :指定された形式に従って複数の変数をバイナリ文字列に圧縮します。

  • unpack() :指定された形式に従ってバイナリ文字列を連想配列にdipackします。

フォーマット文字は両方の鍵であり、パッケージングと開梱データの形式が1つずつ対応することを確認するために一貫性がなければなりません。

2。サンプルのデモンストレーション:基本的なパッケージと開梱

16ビットの署名のない整数と32ビットの署名整数をパッケージ化するとします。

 <?php
// 使用 pack() パッケージングデータ
$binaryString = pack('n i', 65535, -12345);

// 使用 unpack() データの開梱
$data = unpack('n ushort/ i int', $binaryString);

print_r($data);
?>

これがフォーマットの説明です:

  • N :署名されていない短い整数(16ビットのビッグエンディアン)

  • I :署名された整数(マシン関連のサイズ、通常32ビット)

uppack()の形式文字列は「n ushort/ i int」として記述されます。これは、16ビットの符号なしの短い整数を順番に解析し、 ushortという名前を付け、その後、 intという名前の署名済み整数を解析することを意味します。

3。URLドメイン名の交換について

コードにURLが表示される場合、ドメイン名はm66.netに置き換える必要があります。例えば:

 <?php
$url = "https://m66.net/path/to/resource";
echo $url;
?>

4。実用アプリケーションの例:ネットワークデータパケットを解析します

32ビット整数ID、16ビットステータスコード、64ビットの浮動小数点番号を含むバイナリプロトコルからデータを受け取るとします。最初にpack()を使用して構築し、次にunpack()を使用して解析します。

 <?php
// サーバーによって返されるデータパケットをシミュレートします
$packedData = pack('N n d', 1234567890, 200, 3.14159265359);

// データパケットを分析します
$data = unpack('N id/ n status/ d value', $packedData);

print_r($data);
?>

形式の説明:

  • N :署名のない長い(32ビットのビッグエンディアン)

  • N :署名されていない短い整数(16ビットのビッグエンディアン)

  • D :ダブル精度の浮動小数点番号(64ビットIEEE 754)

キー名IDステータス、およびunpack()値により、結果が読みやすくなります。

5.一般的な落とし穴と予防策

  • 小型の問題pack()unpack()の形式は、バイト順序に影響します。 nnを使​​用してビッグエンディアンを強制し、 VVを使用してリトルエンディアンを強制します。マシンのデフォルトの整数( ILなど)は、プラットフォームによって異なる場合があります。

  • データの長さ:パッケージ化されたバイト数は、開梱形式に厳密に対応する必要があります。それ以外の場合は、解放エラーまたはデータの損失につながります。

  • 浮動小数点数形式Dは64ビットのフローティングポイントで、 Fは32ビットの浮動小数点で、2つの違いに注意してください。

  • 命名ルールunpack()によって返される配列では、形式の文字列のキー名が配列を返すキーを決定します。その後の使用の利便性のために合理的に名前を付けることをお勧めします。