PHPでは、 Pack()およびUnpack()関数はバイナリデータの処理によく使用され、特にネットワーク通信、ファイルの読み取りと書き込み、データエンコーディングなどのシナリオでの使用に適しています。バイトの正確な制御が必要です。この記事では、これら2つの機能の使用について詳細に説明し、バイナリデータをより効率的に処理できるように、完全なフォーマットコード比較テーブルを添付します。
pack() :データをバイナリ文字列にパッケージ化します。
unpack() :バイナリ文字列をPHPアレイに解凍します。
どちらもフォーマットコードを使用してデータの構造を定義し、データのエンコード/デコードの方法を決定します。
$data = pack("C*", 72, 101, 108, 108, 111); // 意思 ASCII コードを文字列に変換します "Hello"
echo $data; // 出力: Hello
文法:
string pack(string $format, mixed $values...)
$data = "Hello";
$result = unpack("C*", $data);
print_r($result);
出力:
Array
(
[1] => 72
[2] => 101
[3] => 108
[4] => 108
[5] => 111
)
文法:
array unpack(string $format, string $data, int $offset = 0)
フォーマットコード | 説明します | バイトの長さ | 大小の端 |
---|---|---|---|
a | nulは文字列を埋めます(nulを削除しません) | 長さを指定します | なし |
a | スペースが弦を埋める(テールスペースが取り外されます) | 長さを指定します | なし |
h | ヘキサデシマル文字列、各文字は4ビットを表します | 2桁ごとに= 1バイト | なし |
h | CAPS 16分体で、各文字は4ビットを示します | 2桁ごとに= 1バイト | なし |
c | 署名された文字(8ビット) | 1バイト | なし |
c | 署名されていない文字(8ビット) | 1バイト | なし |
s | 署名された短い整数(16ビット) | 2バイト | ホストバイトオーダー |
s | 符号なしショート整数(16ビット) | 2バイト | ホストバイトオーダー |
n | 署名されていない短い整数(16ビット)、ネットワークバイト順序 | 2バイト | ビッグエンディアン |
v | 符号なしの短い整数(16ビット)、リトルエンディアンバイト順序 | 2バイト | リトルエンディアン |
私 | 署名された整数(機械関連) | 4バイトまたは8バイト | ホストバイトオーダー |
私 | 署名されていない整数(機械関連) | 4バイトまたは8バイト | ホストバイトオーダー |
l | 署名された長い整数(32ビット) | 4バイト | ホストバイトオーダー |
l | 署名の長い(32ビット) | 4バイト | ホストバイトオーダー |
n | 署名されていない長い整数(32ビット)、ネットワークバイト順序 | 4バイト | ビッグエンディアン |
v | 署名されていない長い整数(32ビット)、リトルエンディアンバイトの順序 | 4バイト | リトルエンディアン |
f | シングルエシジョンフローティングポイント番号(32ビット) | 4バイト | ホストバイトオーダー |
d | 二重精度の浮動小数点数(64ビット) | 8バイト | ホストバイトオーダー |
x | バイトを入力します(1バイトをスキップ) | 1バイト | なし |
x | 1バイトを巻き戻します | 1バイト | なし |
@ | 絶対的な位置を設定します(スキップ/フォールバックポジションに戻ります) | 変数 | なし |
$ip = "192.168.1.1";
$packed = pack("C4", ...explode('.', $ip));
echo bin2hex($packed); // 出力 c0a80101
$unpacked = unpack("C4", $packed);
echo implode('.', $unpacked); // 出力 192.168.1.1
$binary = file_get_contents("https://m66.net/example/file.bin");
$header = unpack("a4signature/Nsize", $binary);
print_r($header);
たとえば、フォーマットコードは数量で変更できます。
C4 :4つの署名されていない文字を表します
A10 :10文字を表すスペースを持つパッド付き文字列
@8 :8番目のバイト位置にジャンプします
*を使用して、できるだけ読み取ることもできます。
$data = unpack("C*", "Hello"); // すべてのバイトを読んでください
PHPのPack()およびUnpack()は、強力なバイナリ処理ツールです。そのフォーマットコードと使用に精通していると、基礎となるデータをより柔軟に処理することができます。プロトコルの解析、構造化データの保存、または効率的なネットワーク通信プロトコルの構築など、これら2つの機能は非常に実用的なツールです。
多くの形式コードがありますが、一般的に使用されるタイプ( C 、 N 、 N 、 F 、 Dなど)を習得すると、ほとんどのニーズを満たすことができます。開発で一緒にbin2hex()とhex2bin()を使用することをお勧めします。デバッグはより便利です。