引数の解釈処理は適当なので注意してください。 パラメータを取らない引数は最初の一文字だけチェックされます。 引数の文字とパラメータの間のスペースは省略可能です。 パラメータは 10 進数、16 進数、8 進数で指定できます。 -c8 、 -c 8 、 -c 010 、 -cols 8 はすべて同じ意味です。
xxd -r では行番号の評価に関しての暗黙のルールがいくつかあります。 出力ファイルがシーク可能なら、各行の行番号が順番通りに並んでなくても構いません。 位置が飛んでいても重なっていても大丈夫です。 その場合、次の位置に移動するために lseek(2) が使われます。 出力ファイルがシーク不可なら、「隙間」だけが処理可能です。 隙間は null バイトで埋められます。
xxd -r は不正な入力をエラーにしません。ゴミは静かに読み飛ばされます。
16 進ダンプを編集するときは注意が必要です。 xxd -r は必要な桁 (-c 引数参照) だけ 16 進データを読み込んで、行の残りを無視します。 つまり、ascii (または ebcdic) を示している列への変更は無視されます。 xxd -r -p でプレーン形式 (ポストスクリプト形式) の 16 進ダンプを元に戻す場合は、列の数は影響しません。 2 桁の 16 進数と認識できるものはすべて変換されます。
% xxd -i file
と
% xxd -i < file
の結果は違います。注意してください。
xxd -s +seek と xxd -s seek, の違いは、lseek(2) を使って入力を "巻き戻す" かどうかです。'+' が意味を持つのは、入力が標準入力で、xxd が起動されたときに標準入力のファイル位置がファイルの先頭ではなかった場合です。 以下の例が分かりやすいかもしれません (もっと混乱するかも!)...
`cat' が既に標準入力を終わりまで読んでいるので、読む前に標準入力を巻き戻す必要がある。
% sh -c "cat > plain_copy; xxd -s 0 > hex_copy" < file
ファイル位置 0x480 (=1024+128) 前方から 16 進ダンプする。
`+' は 「現在地からの相対位置」を意味するので、dd が 1k 処理した後から、さらに `128' 進めます。
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet" < file
ファイル位置 0x100 ( = 1024-768) から 16 進ダンプする。
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet" < file
このような使い方はあまりしませんし、`+' を使うこともほとんどないでしょう。 -s を使うときはいつでも、strace(1) や truss(1) を使って、xxd の働きをチェックすることをお勧めします。
ファイル
の最初の三行 (16 進数で 0x30 バイト) 以降を出力する。
% xxd -s 0x30 file
ファイル
の最後から三行 (16 進数で 0x30 バイト) を出力する。
% xxd -s -0x30 file
120 バイトを、平文 16 進ダンプ形式で一行に 20 オクテットずつ出力する。
% xxd -l 120 -ps -c 20 xxd.1
2e54482058584420312022417567757374203139
39362220224d616e75616c207061676520666f72
20787864220a2e5c220a2e5c222032317374204d
617920313939360a2e5c22204d616e2070616765
20617574686f723a0a2e5c2220202020546f6e79
204e7567656e74203c746f6e79407363746e7567
この man ページの先頭から 120 バイトを一行に 12 オクテットずつ 16 進ダンプする。
% xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\
0000030: 220a 2e5c 2220 3231 7374 204d "..\" 21st M
000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\"
0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\"
0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
xxd.1 の日付部分だけを出力する。
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
input_file
を
output_file
にコピーし、先頭に 0x00 を 100 バイト分付け加える。
% xxd input_file | xxd -r -s 100 > output_file
xxd.1 の日付を修正する。
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
中身がすべて 0x00 の 65537 バイトのファイルを作成する。
ただし、最後のバイトだけは 'A' (hex 0x41)。
% echo "010000: 41" | xxd -r > file
作成したファイルをオートスキップを使って 16 進ダンプする。
% xxd -a -c 12 file
0000000: 0000 0000 0000 0000 0000 0000 ............
*
000fffc: 0000 0000 40 ....A
一文字の 'A' からなる 1 バイトのファイルを作成する。
'-r -s' の後に指定した数値がファイル中の行番号に加算され、結果、余計なバイトが飛ばされる。
% echo "010000: 41" | xxd -r -s -0x10000 > file
vim(1)
の中から xxd をフィルタとして実行し、
マークされた `a' から `z' までの領域を 16 進ダンプする。
:'a,'z!xxd
vim(1)
の中から xxd をフィルタとして実行し、
マークされた `a' から `z' までの領域をバイナリに戻す。
:'a,'z!xxd -r
vim(1)
の中から xxd をフィルタとして実行し、16 進ダンプされた行を元に戻す。
戻したい行にカーソルを移動して:
!!xxd -r
シリアル行から一文字読み込む
% xxd -c1 < /dev/term/b &
% stty < /dev/term/b -echo -opost -isig -icanon min 1
% echo -n foo > /dev/term/b
私の功績として自由に配布してください。
儲かったら教えてください。
損しても知りません。
マニュアルは Tony Nugent
<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
によって書かれ、
Bram Moolenaar が少し変更を加え、
Juergen Weigert が編集しました。