【 hexdump 】コマンド――ファイルを8進数や16進数でダンプするLinux基本コマンドTips(253)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを8進数や16進数でダンプする「hexdump」コマンドです。

» 2018年10月26日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ファイルを8進数や16進数でダンプする「hexdump」コマンドです。

hexdumpコマンドとは?

 「hexdump」はファイルや標準入力から受け取った内容を8進数や16進数でダンプするコマンドです。出力フォーマットを指定することも可能です。

 「ダンプ(dump)」は記録などの中身をまとめて表示したり、記録したりするという意味で、「hex」は16進法を意味します。

 ファイルを8進数や16進数でダンプするコマンドには、hexdumpの他に、odコマンド(連載第93回)やxxdコマンド(第254回)などがあります。



hexdumpコマンドの書式

hexdump [オプション] [ファイル名...]

※[ ]は省略可能な引数を示しています。





hexdumpの主なオプション

短いオプション 意味
-b 1バイト単位の8進数(3桁)で表示する
-o 2バイト単位の8進数(6桁)で表示する
-c 1バイト単位のASCII文字で表示する
-C 16進数とASCII文字で表示する
-d 2バイト単位の10進数(5桁)で表示する
-x 2バイト単位の16進数(4桁)で表示する(デフォルト)
-e フォーマット 表示用のフォーマット文字列を指定(書式記号には""を付け、全体は''で囲む)
-f ファイル フォーマット文字列を書いたファイルを指定する
-n バイト数 表示するバイト数を指定する(「-n 20」で先頭の20バイトを表示、※1)
-s バイト数 表示する開始位置(オフセット)を指定する(※1、※2)
-v 全ての入力内容を出力する(-vを付けなかった場合、直前の行と同じ内容と同じ内容を「*」記号1文字でまとめる)

※1 -nと-sは先頭に0xを付けた場合16進数、0を付けた場合は8進数という指定になる。
※2 数字の末尾に小文字の「k」「m」を付けた場合、それぞれ1024倍、1048576倍を意味する。



フォーマット文字列

文字列 意味
%桁数_ad 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の10進数で表示
%桁数_ao 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の8進数で表示
%桁数_ax 次に表示される文字のファイル内の位置(オフセット)を、指定した桁数の16進数で表示
%_A[dox] 最後の位置を10進数(%A_d)か8進数(%A_o)、16進数(%A_x)で表示
%c デフォルト文字セット(ASCII文字列)で出力(※3)
%_c デフォルト文字セット(ASCII文字列)で出力、表示できない文字は3桁の8進数で表示
%_p デフォルト文字セット(ASCII文字列)で出力、表示できない文字は「.」で表示
%_u ASCII文字列で出力、制御コードは「nul」や「lf」などの文字で表し、0xff以降の文字は16進数で表示する
%d 10進数(※4)
%o 8進数(※4)
%X, %x 16進数(%Xは大文字、%xは小文字で表示)(※4)
\t タブ
\n 改行
\r 復帰
\f フォームフィード(改ページ)
\0 NUL文字

※3 表示できない文字があると表示が乱れる。
※4 デフォルトは4バイト単位。1バイトまたは2バイト単位に設定可能。桁数も指定できる。0埋めで3桁の8進数(%o)ならば「%03o」のようにする。また、double型用の%E、%e、%f、%G、%gも使用可能。





ファイルの内容を16進数で出力する

 「hexdump ファイル名」で、指定したファイルを16進数でダンプします。各行の先頭には表示位置(オフセット)を16進数で表示します。最後の行のオフセットは、ファイルのサイズを16進数で表示した数値になります。

 「hexdump -C ファイル名」では、オフセットや16進数と合わせて、右側にダンプの内容をASCII文字で表示します。ASCII文字で表示できない部分は「.」に置き換えます。この場合、1行に16バイト分のダンプ結果を表示します。

 オプションなしで実行した場合は、2バイト単位で処理を進めます。このとき最下位のバイトから順番に出力します(リトルエンディアン)。「-C」オプションを付けた場合、ASCII文字と同じ1バイト単位で処理を進めます(※5)。

 画面1では、headコマンドでファイルの冒頭部分を表示しています。画面2ではテキストファイルをダンプしました。

※5 例えばファイルの内容が数字の「1234」だった場合、オプションがないと「3231 3433 000a」と表示する。32は数字「2」の文字コード、31は数字「1」の文字コード、0aはLinuxの改行コード(LF)。オプション「-C」を付けると「31 32 33 34 0a」と表示する。



コマンド実行例

hexdump ファイル名

(ファイルを2バイト単位、16進数でダンプする)

hexdump -C ファイル名

(ファイルを1バイト単位、16進数とASCII文字でダンプする)


画面1 画面1 画像ファイルをダンプしたところ
画面2 画面2 テキストファイルをダンプしたところ


表示する範囲を指定する

 ファイルの先頭部分だけをダンプしたい場合は、「-n バイト数」で指定します(画面3)。ダンプの開始位置も「-s バイト数」で指定できます。

コマンド実行例

hexdump -n 80 ファイル名

(先頭から80バイト分ダンプする)

hexdump -s 100 -n 80 ファイル名

(100バイト目から80バイト分ダンプする)

hexdump -s 65 -C sample.txt

(sample.txtを65バイト目からダンプする)(画面3

hexdump -s 65 -n 5 -C sample.txt

(sample.txtを65バイト目から5バイト分ダンプする)(画面3


画面3 画面3 ダンプの開始位置やダンプ範囲を指定したところ


繰り返し部分も全て出力する

 hexdumpは、直前の行と同じ内容の出力を次の行でも繰り返す場合、複数行を省略して「*」とだけ表示します。「-v」オプションを指定すると、繰り返し部分も全て出力します(画面4)。

コマンド実行例

hexdump -v ファイル名

(繰り返し部分を省略せずに出力する)

hexdump -v -C sample2.txt

(sample2.txtを16進数とASCII文字で、繰り返し部分を省略せずに出力する)(画面4


画面4 画面4 省略せずにダンプの結果を出力したところ


出力フォーマットを指定する

 「-e」オプションを指定することで、hexdumpの出力フォーマットを変更できます(画面5)。まず1行当たりの繰り返し数を指定し、その後、「/」で区切ってバイト数を書きます。その後、フォーマット文字列を指定します。「繰り返し数/バイト数 フォーマット」という書式全体を、シングルクオート('')で囲んでください。なお、フォーマット部分はダブルクオート("")で囲みます。

 例えば「繰り返し数を指定せず、1バイト単位で、0埋め3桁の8進数で出力」であれば「-e '/1 "%08d"'」と指定します。3桁で出力した後に空白を入れたいのであれば「-e '/1 "%08d "'」、タブ区切りにしたいのであれば「-e '/1 "%08d\t"'」のようにします。

 改行を入れたい場合は、2番目のフォーマットとして「-e '"\n"'」を追加します。この場合、「-e '8/1 "%08d\t"' -e '"\n"'」のように、繰り返し数も指定しましょう。

 以下のコマンド実行例では4番目のみ改行し、それ以外は改行しません。「0埋め3桁」とは、例えば1桁の8進数「3」を「003」と表示する指定です。

コマンド実行例

hexdump -e '/1 "%03o"' sample.txt

(1バイト単位、0埋め3桁の8進数で出力)

hexdump -e '/1 "%03o "' sample.txt

(1バイト単位、0埋め3桁の8進数+空白で出力)

hexdump -e '/1 "%03o\t"' sample.txt

(1バイト単位、0埋め3桁の8進数+タブで出力)

hexdump -e '8/1 "%03o\t"' -e '"\n"' sample.txt

(1バイト単位、0埋め3桁の8進数+タブで出力、8回出力ごとに改行する)(画面5


 行頭にファイル内の位置(オフセット)を出力したい場合は「%桁数_ad」「%桁数_ao」「%桁数_ax」のいずれかを使用します。それぞれ10進数、8進数、16進数で出力します。例えば「0埋め6桁の10進数」であれば「-e '"%06_ad"'」とします。

 先ほど4番目のコマンド実行例(タブと改行を入れたフォーマット)にオフセットを追加すると次のコマンド実行例になります。2種類の書式がありますが、どちらの書き方でも同じ結果になります。

コマンド実行例

hexdump -e '"%06_ad "' -e '8/1 "%03o\t"' -e '"\n"' sample.txt

(オフセットを0埋め6桁の10進数で出力し、1バイト単位、0埋め3桁の8進数+タブで出力、これを8回出力するごとに改行する)

hexdump -e '"%06_ad " 8/1 "%03o\t"' -e '"\n"' sample.txt画面5


画面5 画面5 フォーマットを指定してダンプしたところ

 オフセットとダンプに加えて、ASCII文字も出力したい場合は、「%c」「%_c」「%_p」「%_u」のいずれかを使用します(画面6)。それぞれ、表示できない文字の扱いが異なります(フォーマット文字列を参照)。ここでは「%_p」を使用しています。「%_p」は、表示できない文字を「.」1文字に出力します。

コマンド実行例

hexdump -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt

(オフセットを0埋め6桁の10進数で出力し、1バイト単位、0埋め3桁の8進数+タブで出力、ASCII文字を出力、これを8回出力するごとに改行する)(画面6


 さらに、最後のオフセットを出力したい場合は「%_Ad」「%_Ao」「%_Ax」のいずれかを追加します。この部分は他の指定とは独立して、「-e '"%06_Ao\n"'」(0埋め6桁の8進数で出力して改行)や「-e '"%_Ad\n"'」(10進数で出力して改行)のように指定します。どこに指定しても、全ての出力が終わった後、一度だけ出力します。

コマンド実行例

hexdump -e '"%06_Ad\n"' -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt

(最後のオフセットを0埋め6桁の10進で出力し改行する)

hexdump -e '"(%_Ad byte)\n"' -e '"%06_ad " 8/1 "%03o\t"' -e '"\t" "%_p"' -e '"\n"' sample.txt

(最後のオフセットを10進数で「(n byte)」と出力し改行する、※6)(画面6


※6 「-s」や「-n」で表示範囲を指定しなかった場合は、ファイルのサイズを指定できるが、「-s」や「-n」を指定した場合はその分だけサイズがずれてしまう。



画面6 画面6 ASCII文字も出力するようにフォーマットを指定したところ


ファイルに記録した出力フォーマットを指定する

 「-e」を使わずに出力フォーマットを指定することもできます。ファイルに出力フォーマットの文字列を保存し、「-f ファイル名」と指定します(画面7画面8)。

 ファイルには「-e」の指定1つを1行に書きます。シングルクオートは省略できます。「#」から始まる行はコメントです。

コマンド実行例

hexdump -f フォーマットファイル名 処理ファイル名

(出力フォーマットをファイルから指定する)


#末尾にバイト数を出力(-sや-nを指定しないで使用)
"(%_Ad byte)\n"
"%06_ad " 8/1 "%03o\t"
"\t" "%_p"
"\n"
フォーマットのサンプル1(画面7
画面7 画面7 ファイルに記録した出力フォーマットを使ったところ(その1)
8/1 "%04_ad:%-5_u"
"\n"
フォーマットのサンプル2(画面8
画面8 画面8 ファイルに記録した出力フォーマットを使ったところ(その2)


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。