PHPでは、 Pack()関数は、指定された形式のバイナリ文字列にデータをパッケージ化するために使用され、基礎となるデータ処理、ネットワーク通信プロトコル、ファイル形式分析などのシナリオでよく使用されます。パック()によってパッケージ化されたバイナリデータをよりよく理解およびデバッグするには、通常、 Hexdumpに同様のバイト構造を表示する必要があります。
この記事では、PHPにSimple HexDump()関数を実装し、 Pack()関数を使用してパッケージ化されたバイナリコンテンツを表示する方法を紹介します。
pack()関数の構文は次のとおりです。
string pack(string $format, mixed ...$values)
$フォーマット「C」は、署名されていない文字(1バイト)、 「n」は16ビットの符号なしショート整数(ネットワークバイト順)、 「V」を意味する、「c」などのデータのパッケージ形式を指定します。
$値は、パッケージ化される値のリストです。
例えば:
$bin = pack('Cnv', 0x12, 0x3456, 0x789a);
このステートメントは、次のことを含むバイナリ文字列を生成します。
1バイト:0x12
2バイト(ネットワークシーケンス、ビッグエンディアン):0x3456
2バイト(リトルエンディアン、リトルエンディアン):0x789a
これは、対応するASCII文字を使用して、バイトの16進表現にバイナリ文字列を出力する単純なhexdump()関数です。
function hexdump(string $data): void {
$len = strlen($data);
$offset = 0;
while ($offset < $len) {
// 1行ごとに表示します16バイト
$chunk = substr($data, $offset, 16);
$hex = '';
$ascii = '';
for ($i = 0; $i < strlen($chunk); $i++) {
$byte = ord($chunk[$i]);
$hex .= sprintf("%02X ", $byte);
// 元の文字を表示する印刷可能な文字,それ以外の場合、ドット番号が表示されます
$ascii .= ($byte >= 32 && $byte <= 126) ? $chunk[$i] : '.';
}
// 欠点を補います16バイト时的空格
$hex = str_pad($hex, 16 * 3);
// 出力形式:オフセットアドレス + 16進 + ASCII
printf("%08X %s %s\n", $offset, $hex, $ascii);
$offset += 16;
}
}
pack()関数を使用していくつかのデータをパッケージ化し、 hexdump()で表示するとします。
<?php
// パッケージングデータ:1バイト无符号字符,2バイト网络序,4バイト小端序
$binary = pack('C n V', 0x41, 0x4243, 0x44454647);
hexdump($binary);
?>
実行後、出力は次のとおりです。
00000000 41 42 43 47 46 45 44 00 00 00 00 00 00 00 00 00 ABCGFED..........
分析:
0x41はキャラクター「a」です
0x4243は、ネットワークバイトの順序で42 43として保存されます( 'b' 'c')
0x44454647は、小エンディアンの順序で47 46 45 44として保存されます(ascii 'g' 'f' 'e' 'd'に対応)
Pack()関数の形式文字列は非常に強力です。詳細については、 M66.net/ manual/en/function.pack.phpなどの公式ドキュメントを参照してください。
Hexdump()の実装は、より多くの形式のサポート、より多くのコメントの表示など、要件に応じて調整できます。
バイナリデータの印刷できない文字は直感的に理解することはできず、 hexdump()を使用してデバッグを容易にすることができます。
上記の方法により、開発者はPack()の後にバイナリ構造を直感的に観察できます。これは、データ形式のデバッグと理解に役立ちます。この記事が、hexdump()とpack()の使用をすぐに始めるのに役立つことを願っています。