HEXDUMP(1) | User Commands | HEXDUMP(1) |
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 も同様に使える。
各入力ファイルに対して、hexdump は、入力を -e や -f オプションで指定されたフォーマット文字列に従い、 フォーマット文字列が指定された順序でデータを変換しながら、標準出力に順次書き出していく。
フォーマット文字列は、空白 (またはタブ) で区切られた任意の数のフォーマット単位から構成される。1 つのフォーマット単位は、最大で 3 個の要素、すなわち、繰り返し回数、バイト数、フォーマットを含んでいる。
フォーマット単位は、「繰り返し回数 / バイト数 "フォーマット"」という書式になる。"フォーマット" 以外は省略できる。
繰り返し回数は、指定が任意の (訳注: すなわち、省略可能な) 正の整数であり、デフォルトは 1 である。各フォーマットは繰り返し回数だけ適用される。
バイト数も、指定が任意の正の整数である。これが指定されている場合は、そのフォーマットを 1 回適用するごとに処理するバイト数を示している。
繰り返し回数やバイト数を指定する場合、どちらの数字か区別できるように、 繰り返し回数の後や、バイト数の前にスラッシュを 1 個置かなければならない。 スラッシュの前後に空白があっても、無視される。
フォーマットは必須であり、ダブルクォート (" ") で囲まなければならない。 このフォーマットは、fprintf 形式のフォーマット文字列 (fprintf(3) を参照) として解釈されるが、以下のような例外がある。
hexdump ユーティリティは、さらに以下の変換文字列もサポートしている:
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]]
変換文字で使われるデフォルトのバイト数とサポートされるバイト数は、以下の通りである。
各フォーマット文字列によって解釈・変換されるデータの量は、 各フォーマット単位が要求するデータの合計である。 各フォーマット単位が要求するデータは、(繰り返し回数) 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 と同じ結果が得られるはずである。
April 2013 | util-linux |