現在の位置: ホーム> 最新記事一覧> hexdump()を使用して、パッケージ()関数を梱包した後にバイナリ構造を表示する方法は?

hexdump()を使用して、パッケージ()関数を梱包した後にバイナリ構造を表示する方法は?

M66 2025-06-12

PHPでは、 Pack()関数は、指定された形式のバイナリ文字列にデータをパッケージ化するために使用され、基礎となるデータ処理、ネットワーク通信プロトコル、ファイル形式分析などのシナリオでよく使用されます。パック()によってパッケージ化されたバイナリデータをよりよく理解およびデバッグするには、通常、 Hexdumpに同様のバイト構造を表示する必要があります。

この記事では、PHPにSimple HexDump()関数を実装し、 Pack()関数を使用してパッケージ化されたバイナリコンテンツを表示する方法を紹介します。


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


hexdump()関数をカスタマイズします

これは、対応する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;
    }
}

例:hexdump()を使用して、pack()の結果を表示します

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()の使用をすぐに始めるのに役立つことを願っています。