hexdump - ファイルの内容を 16
進数、10 進数、8
進数、ASCII
文字で表示する
hexdump [options]
file...
これは、util-linux 版の
hexdump
コマンドのマニュアルである。
hexdump
コマンドの実装には、いくつかの系統がある。御使用のディストリビューションが
util-linux 版以外の
hexdump
コマンドを採用している場合は、
動作やオプションがここで説明しているものとかなり違っているかもしれない。
そういうときは、英語版しかないかもしれないが、お手元の
hexdump
コマンドに付属するマニュアルに当たってみていただきたい。
hexdump
ユーティリティは、指定されたファイルをユーザーが指定したフォーマットで表示するフィルタである。
ファイルが指定されていない場合は、標準入力を処理の対象にする。
以下で使用する引き数
length や
offset
の後ろには、KiB (=1024), MiB (=1024*1024)
のような乗数を表す接尾辞を付けることができる。GiB,
TiB, PiB, EiB, ZiB, YiB
も同様に使える ("iB"
を続けるのは任意であり、たとえば、"K"
は "KiB"
と同じ意味だ)。また、KB
(=1000), MB (=1000*1000)
のような接尾辞を付けてもよい。GB,
TB, PB, EB, ZB, YB
も同様に使える。
-
-b, --one-byte-octal
-
1 バイト単位の 8
進数表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
1 バイトずつ 0
で字詰めした 3 桁の 8
進数で表現し、それを
1 行当たり 16
個、空白で区切って表示する。
-
-c, --one-byte-char
-
1 バイト単位の ASCII
文字表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
1
キャラクタずつ、空白で字詰めした
3 桁の ASCII
文字で表現し、それを
1 行当たり 16
個、空白で区切って表示する
(訳注:
表示不能文字は、エスケープ表記が可能なものはエスケープ表記で、
できないものは、3
桁の 8
進数で表示される)。
-
-C, --canonical
-
標準的な 16 進数 +
ASCII での表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
1 バイトずつ 2 桁の 16
進数で表現し、それを
1 行当たり 16
個、空白で区切って表示する。
その後に、2 つの ' |'
で囲まれた中に同じ
16 バイトを %_p
フォーマットで表示する。
-
-d, --two-bytes-decimal
-
2 バイト単位の 10
進数表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
2 バイトずつ 0
で字詰めした 5
桁の符号なし 10
進数で表現し、それを
1 行当たり 8
個、空白で区切って表示する。
-
-e, --format format_string
- データを表示するために使われるフォーマット文字列を指定する
(訳注:
フォーマット文字列は、シングルクォート
(' ')
で囲む必要がある)。
-
-f, --format-file file
- 1
個以上のフォーマット文字列を、改行で区切って書き込んだファイルを指定する。
空行や、空白を除いた最初の文字がハッシュマーク
(#)
である行は無視される
(訳注: -e
オプションと違って、こちらでは、
フォーマット文字列、すなわち各行をシングルクォートで囲んではいけない)。
-
-L, --color[=when]
- フォーマット中のカラー指定単位
(color unit)
を出力に使用する。
指定が任意の引き数
when は、auto, never, always
のいずれかである。引き数
when
を省略すると、デフォルトの
auto になる。
カラー表示は、無効にすることもできる。
プログラムに埋め込まれた現在のデフォルトが有効か無効かは、
--help
の出力を見ればわかる。
後述の「
カラー指定」サブセクションと「
カラー表示」セクションも参照していただきたい
(訳注:
短いオプション -L
に引き数を付けるときは、間に空白を入れずに
-Lalways
のように直接続けなければならない)。
-
-n, --length length
- 入力の length
バイト分だけを処理する。
-
-o, --two-bytes-octal
-
2 バイト単位の 8
進数表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
2 バイトずつ 0
で字詰めした 6 桁の 8
進数で表現し、それを
1 行当たり 8
個、空白で区切って表示する。
-
-s, --skip offset
- 入力の先頭から
offset
バイトを読み飛ばす。
-
-v, --no-squeezing
-
-v
オプションを指定すると、
hexdump
は、入力データをすべて表示するようになる。
-v
オプションを指定しない場合は、直前の出力行と
(入力オフセット以外が)
同じ内容の行は、何行であっても、ただ
1
個のアスタリスクからなる
1
行に置き換えられる。
-
-x, --two-bytes-hex
-
2 バイト単位の 16
進数表示。
入力オフセットを 16
進数で表示し、その後に、入力データを
2 バイトずつ 0
で字詰めした 4 桁の 16
進数で表現し、それを
1 行当たり 8
個、空白で区切って表示する。
-
-V, --version
- バージョン情報を表示して、終了する。
-
-h, --help
- ヘルプを表示して、終了する。
各入力ファイルに対して、
hexdump は、入力を
-e や
-f
オプションで指定されたフォーマット文字列に従い、
フォーマット文字列が指定された順序でデータを変換しながら、標準出力に順次書き出していく。
フォーマット文字列は、空白
(またはタブ)
で区切られた任意の数のフォーマット単位から構成される。1
つのフォーマット単位は、最大で
3
個の要素、すなわち、繰り返し回数、バイト数、フォーマットを含んでいる。
- [訳注]
- 各フォーマット文字列は
1
行からなる。フォーマット文字列を複数個指定すると、
その各々が、同じ 1
つの処理単位 (後述の
ブロックである。「処理されるバイト数」セクションを参照)
に対して、重ねて適用されることになる
(すなわち、どのフォーマット文字列もブロックの先頭から適用される)。
複数のフォーマット文字列を指定するには、
-e オプションでは、
-e
を複数回使えばよい。
-f
オプションでは、改行で区切って複数行にする。
フォーマット単位は、「繰り返し回数
/ バイト数
"フォーマット"」という書式になる。"フォーマット"
以外は省略できる。
繰り返し回数は、指定が任意の
(訳注:
すなわち、省略可能な)
正の整数であり、デフォルトは
1
である。各フォーマットは繰り返し回数だけ適用される。
バイト数も、指定が任意の正の整数である。これが指定されている場合は、そのフォーマットを
1
回適用するごとに処理するバイト数を示している。
繰り返し回数やバイト数を指定する場合、どちらの数字か区別できるように、
繰り返し回数の後や、バイト数の前にスラッシュを
1
個置かなければならない。
スラッシュの前後に空白があっても、無視される。
フォーマットは必須であり、ダブルクォート
(" ")
で囲まなければならない。
このフォーマットは、fprintf
形式のフォーマット文字列
(
fprintf(3) を参照)
として解釈されるが、以下のような例外がある。
- 1.
- フィールドの幅や精度としてアスタリスク
(*) を使えない。
- 2.
- 変換文字 s
のそれぞれについて、バイト数かフィールド精度が必要である。
(その点が、精度が指定されていない場合に全ての文字列を表示する
fprintf(3)
のデフォルトとは異なる)。
- 3.
- 変換文字
h, l, n, p, q
がサポートされていない。
- 4.
- C
言語の規格に書かれている
1
文字のエスケープシーケンスがサポートされている:
- NULL
- \0
- <アラート文字>
- \a
- バックスペース
- \b
- フォームフィード
- \f
- 改行
- \n
- 復帰
- \r
- タブ
- \t
- 垂直タブ
- \v
hexdump
ユーティリティは、さらに以下の変換文字列もサポートしている:
- _a[dox]
- 次に表示されるバイトの入力オフセット
(複数の入力ファイルで通算した値)
を表示する。 文字
d, o, x
を後ろに付けると、オフセットの表示がそれぞれ
10, 8, 16 進数になる。
- _A[dox]
- 変換文字列 _a
とほぼ同じ。ただし、この変換は全ての入力データが処理された後で
1
回だけ実行される。
- _c
- デフォルト文字セットの文字で出力する。表示不能な文字は、0
で字詰めした 3 桁の 8
進数で表示される。ただし、標準エスケープ表記で表現できる文字
(上記を参照)
は、その 2
文字の文字列で表示される。
- _p
- デフォルト文字セットの文字で出力する。表示不能な文字は、1
個の ' .'
として表示される。
- _u
- US ASCII
文字で出力する。
ただし、制御文字は以下のような小文字の名前を使って表示される。
16 進数で 0x7f
より大きい文字は、16
進数の文字列として表示される。
000 nul |
001 soh |
002 stx |
003 etx |
004 eot |
005 enq |
006 ack |
007 bel |
008 bs |
009 ht |
00A lf |
00B vt |
00C ff |
00D cr |
00E so |
00F si |
010 dle |
011 dc1 |
012 dc2 |
013 dc3 |
014 dc4 |
015 nak |
016 syn |
017 etb |
018 can |
019 em |
01A sub |
01B esc |
01C fs |
01D gs |
01E rs |
01F us |
07F del |
|
|
|
フォーマット指定子
(訳注:
変換文字や変換文字列)
の末尾にカラー指定を追加すると、hexdump
は、対応する文字列
(訳注: たいていは 16
進数などの数値)
を指定された色でハイライトする。
条件が存在する場合は、ハイライトする前に評価される
(訳注:
カラー指定の実例については、「
用例」セクションの
3
番目の例をご覧になっていただきたい)。
_L[color_unit_1,color_unit_2,...,color_unit_n]
カラー指定単位 (color unit)
の完全な書式は以下のとおりである:
[!]COLOR[:VALUE][@OFFSET_START[-END]]
- !
- 条件を否定する。
注意していただきたいが、あるカラー指定単位について否定することに意味があるのは、
値/文字列と、オフセットの両方を指定したときだけである。
その場合は、値/文字列がそのオフセットにあるものとマッチしなかったときにのみ、
対応する出力文字列がハイライトされることになる。
- [訳注]
- 上で言っているのは、否定は、あるオフセット、または比較的狭いオフセットの範囲に、
ある値が存在しないことを調べるためのものだということだろう。
広範囲についてそれをやるのは、色彩を反転させるだけで、否定しないときと事実上同じことになる。
- COLOR
- シェルで使われる
8 種の基本色の 1 つ。
- VALUE
- マッチすべき値。16
進数、8
進数、または文字列で指定する。
hexdump
はカラー指定単位の中では、通常の
C
言語のエスケープシーケンスを解釈しないことに注意していただきたい。
- OFFSET
- マッチするか否かをチェックするオフセット、またはオフセットの範囲
(訳注:
このオフセットは 10
進数で指定するようだ)。OFFSET_START
だけ指定すると、END
オフセットが同じ値になることに注意していただきたい。
変換文字で使われるデフォルトのバイト数とサポートされるバイト数は、以下の通りである。
-
%_c, %_p, %_u, %c
- 1 バイトのみ。
-
%d, %i, %o, %u, %X, %x
- 4
バイトがデフォルト。1,
2, 4
バイトがサポートされている。
-
%E, %e, %f, %G, %g
- 8
バイトがデフォルト。4
バイトがサポートされている。
各フォーマット文字列によって解釈・変換されるデータの量は、
各フォーマット単位が要求するデータの合計である。
各フォーマット単位が要求するデータは、(繰り返し回数)
x (バイト数) である。
バイト数が指定されていない場合は、
(繰り返し回数) x
(そのフォーマットが要求するバイト数)
になる。
入力は
ブロック
単位で処理される。ここで言うブロックとは、
フォーマット文字列のいずれかによって指定されるデータの量のうちで、
最大のもののことである
(訳注:
そのようにブロックの大きさが決まると、
複数のフォーマット文字列が指定されている場合は、
その各フォーマット文字列が、同じ
1 つの処理単位
(つまり、
ブロック)
に繰り返し適用されることになる)。入力ブロック
1
個分のデータより少ないバイト数しか解釈しないフォーマット文字列については、
その最後のフォーマット単位が、何バイトかを解釈・変換するものであり、
しかも繰り返し回数が
指定されていないならば、
その繰り返し回数を増加させて、入力ブロック全体の処理が済むか、
あるいは、フォーマット文字列の要求を満たすだけのデータがブロックになくなるまで、処理を続ける。
ユーザの指定によって、あるいは、上述のように
hexdump
が繰り返し回数を変更していることによって、繰り返し回数が
2
回以上になっている場合は、(訳注:
そのフォーマット単位で、たとえば
'8/1 "%02x "' や '"%_p "'
のように、各出力項目の末尾に空白を追加することになっていても)
最後の繰り返しにおける末尾の空白は出力されない。
フォーマット単位で、バイト数とともに複数の変換文字や変換文字列を指定するのは誤用である。
ただし、変換文字や変換文字列の
1 つ以外のすべてが、
_a や
_A
であるときは、問題がない。
-n
オプションを指定したり、ファイルの終わりに達したために、
入力データがフォーマット文字列の一部しか満たさなかった場合、
その入力ブロックには、利用できるすべてのデータを表示するのに足りるだけのゼロバイト
(ASCII NUL) が補われる
(換言すると、フォーマット単位が、データの末尾からはみ出している場合、
そのフォーマット単位は、いくつかのゼロバイトを表示することになる)。
そうしたフォーマット文字列による追加の出力は、相当する数の空白で置き換えられる。
相当する数の空白というのは、
s
変換文字が、実際に指定されている変換文字や変換文字列と同じフィールド幅と精度を持ち、
'
+', ´ ´, '
#'
と言った変換フラグが付いていれば、それを取り除いたときに、
NULL
文字列に対して出力する数の空白のことである。
フォーマット文字列が指定されていない場合、デフォルトの表示は、
-x
オプションの出力形式とよく似たものになる
(ただし、
-x
オプションを付けた方が、フォーマット単位間のスペースがデフォルトの出力より広くなる)。
hexdump は成功すると 0
を返して終了する。
エラーが起きた場合は、1
以上を返して終了する。
入力を「ためつすがめつ見直し」フォーマットで表示する:
"%06.6_ao " 12/1 "%3_u "
"\t\t" "%_p "
"\n"
-x
オプションを実装する:
"%07.7_Ax\n"
"%07.7_ax " 8/2 "%04x " "\n"
MBR
ブートシグネチャの例:
アドレスをシアンで、オフセット
510 と 511
にあるバイトの値が
0xAA55
の場合は緑、その他の場合は赤でハイライトする。
"%07.7_Ax_L[cyan]\n"
"%07.7_ax_L[cyan] " 8/2 " %04x_L[green:0xAA55@510-511,!red:0xAA55@510-511] " "\n"
空ファイル
/etc/terminal-colors.d/hexdump.disable
を置くことで、暗黙のカラー表示を無効化できる。
カラー設定の詳細については
terminal-colors.d(5)
を参照していただきたい。
hexdump ユーティリティは
IEEE Std 1003.2 ("POSIX.2")
に適合しているはずである。
この hexdump
コマンドは、util-linux
パッケージの一部であり、Linux
Kernel Archive <
https://www.kernel.org/pub/linux/utils/util-linux/>
から入手できる。
この man
ページの翻訳の最初のバージョンは、NetBSD
jman proj
から寄贈していただいたものだった。また、翻訳にあたっては、FreeBSD
jpman project <
http://www.jp.freebsd.org/man-jp/>
の翻訳を参考にさせていただいた。両プロジェクトの翻訳者の方々にお礼を申し上げる。
説明がわかりにくかったと思うので、翻訳者の判断で、用例をもう一つ追加して、説明を補足してみる。
却って混乱が増すようなら、読み飛ばしていただきたい。
hexdump -C
のエミュレーションをしてみよう。次のような内容のファイルを
hexchar.fmt
という名前で作成する。
"%08.8_Ax\n"
"%08.8_ax " 8/1 "%02x " " " 8/1 "%02x "
" |" "%_p"
"|\n"
各行がフォーマット文字列であり、「"%08.8_ax "」
「8/1 "%02x "」
「" "」
「" |"」 「"%_p"」
といった部分がフォーマット単位、
ダブルクォート (" ")
で囲まれた部分がフォーマットである。
フォーマット単位には、繰り返し回数やバイト数の指定がなく、
フォーマットしか含まれていないこともある。
入力データは、一定の量ごとに分割されて処理される。その一定の量がブロックだが、
ブロックの大きさは、フォーマット文字列の中で最大のデータを要求しているものによって決まる。
上の場合なら、最大のデータを要求しているのは、2
行目であり
(ほかの行はデータの量を指定していない)、1
バイトが 8 回、さらに 1
バイトが 8
回繰り返し処理されるわけだから、合計で
16
バイトが要求されていることになる。
従って、ブロックの大きさは
16
バイトである。言い換えれば、この例では、入力データは
16
バイトずつ処理されるということだ。
各フォーマット文字列は、同一のブロックに対して順番に適用される。
しかも、それぞれが、そのブロックの先頭に戻って、適用されていく。
1
行目は、「すべての入力データの処理が終わったときに、最後から
1
つ先のオフセットを表示せよ」ということだから、ブロックのデータの処理とは関係がない。
2 行目の「"%08.8_ax " 8/1
"%02x " " " 8/1
"%02x "」の意味はこうである。
「まず、次に表示するバイトのオフセットを
8 桁の 16 進数で、先頭を
0
で埋めて表示し、空白を
2
個続ける。それから、1
バイトずつ 8 個
のデータを、2 桁の 16
進数で後ろに空白を付けて
(つまり、空白で区切って)
表示し、空白を 2
個置いて、さらに 1
バイトずつ 8
個のデータを、2 桁の 16
進数で空白で区切って表示せよ」。
3 行目の「" |"
"%_p"」が指示しているのは、「2
行目による出力にすぐ続けて、同じ出力行にまず
' |'
という文字列を表示し、それから、2
行目が処理したのと同じブロックに対して
1 バイトずつ '_p'
変換をして
(つまり、ASCII 文字で)
出力せよ」ということだ。
3
行目は、「最後のフォーマット単位が、何バイトかを解釈・変換するものであり、
しかも繰り返し回数が指定されていない」ので、ブロック全体の処理が済むまで、
最後のフォーマット単位
"%_p"
による処理が繰り返されることになる。
仮に、3 行目と 4 行目を 1
つにし、3
行目を「" |" "%_p"
"|\n"」という形にすると、
フォーマット文字列の「最後のフォーマット単位が、
何バイトかを解釈・変換するもの」ではなくなるので、
自動的な繰り返しの増加が行われないことになる。それ故、両者は別の行になっている。
4
行目は、データに対する処理は何も指定せず、「3
行目による出力のすぐ後ろに
'|'
という文字を書き出してから改行せよ」とだけ指示している。
このすべてが終わると、次のブロックに移って、同じ処理を繰り返していく。
結果として、
hexdump -f hexchar.fmt
sample.txt を実行すれば、
hexdump -C sample.txt
と同じ結果が得られるはずである。