16 進数表示するコマンド (1) xxd

ここではバイト列を 16 進数で表示する方法を紹介します。

16 進数によってバイト列を表示するのは、16 進ダンプとかヘックスダンプなどと呼ばれます。

hexdump コマンドについては「16 進数表示するコマンド (2) hexdump」をみてください。

ヘックスダンプの動機

ヘックスダンプすると、何か問題が起きたときに調査するのに役に立つ場合があります。

例えば、文字化けしているときに、テキストエディタで開いてもゴチャゴチャの文字が表示されるだけですが、 16 進数でデータを表示することで、どんなデータが並んでいるかわかり、どんな理由で文字化けしているのかわかる場合があります。

その他、テキストエディタで開いてもみえないゴミデータ (無駄・予期せぬデータ) が混ざっていたりすることでファイルが読み込めない場合に何が起きているのか確認するのに役に立つ、などです。

xxd コマンドによる HEX ダンプ

ヘックスダンプをするためのコマンドとして、 xxd コマンドがあります。

実際にコマンドを実行してみましょう。

次のようなテキストファイル a.txt があるとします。

ABCDEFGHIJKLMNOPQRSTUVWXYZ

xxd コマンドに、ファイル名を渡すと次のようにファイルの中身をヘックスダンプします。

$ xxd a.txt
00000000: 4142 4344 4546 4748 494a 4b4c 4d4e 4f50  ABCDEFGHIJKLMNOP
00000010: 5152 5354 5556 5758 595a 0a              QRSTUVWXYZ.

標準入力からも入力を受けとるので、次のようにパイプでデータを送ることもできます。

$ echo ABC | xxd
00000000: 4142 430a                                ABC.

デフォルトで 1 行に 16 バイト分、 16 進数表示と ASCII 文字表示をします。

16 進数を大文字表示する場合は -u オプションを指定します。

$ xxd -u a.txt
00000000: 4142 4344 4546 4748 494A 4B4C 4D4E 4F50  ABCDEFGHIJKLMNOP
00000010: 5152 5354 5556 5758 595A 0A              QRSTUVWXYZ.

上のコマンド結果でわかるように、2 バイト毎グループ化して 16 進数ダンプしています。これを例えば 4 バイト毎にグループ化するには -g オプションに続けてグループ化するバイト数 4 を指定します。

$ xxd -u -g 4 a.txt
00000000: 41424344 45464748 494A4B4C 4D4E4F50  ABCDEFGHIJKLMNOP
00000010: 51525354 55565758 595A0A             QRSTUVWXYZ.

さらにグループ化された 16 進数のバイトオーダーをリトルエンディアンで表示するには、-e オプションを指定します。

$ xxd -u -g 4 -e a.txt
00000000: 44434241 48474645 4C4B4A49 504F4E4D  ABCDEFGHIJKLMNOP
00000010: 54535251 58575655   0A5A59           QRSTUVWXYZ.

リトルエンディアンなどのバイトオーダーについては、当サイトの姉妹サイト C 言語入門 の「バイトオーダー」をみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Linux 入門