シェル:バイナリファイルのバイトを読み取り、16進数として印刷する方法


回答:


45

つかいます hexdump(1)

$ hexdump -x /usr/bin/hexdump 
0000000    feca    beba    0000    0300    0001    0700    0080    0300
0000010    0000    0010    0000    5080    0000    0c00    0000    0700
0000020    0000    0300    0000    00a0    0000    b06f    0000    0c00
0000030    0000    1200    0000    0a00    0100    0010    0000    107c
0000040    0000    0c00    0000    0000    0000    0000    0000    0000
0000050    0000    0000    0000    0000    0000    0000    0000    0000

...


6
またチェックしてくださいod。と呼ばれるviスタイルの16進エディタもありhexerます。
ローレンス

8
「hexdump -C file」の出力の方が好きです。xxdも素晴らしいツールです。
カンバス

bashヘキサ形式で表示hexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power 14年

詳細については、最初の列はバイトの16進オフセットであり、行の残りは8バイトの2バイト表示、つまり16バイトです。これが、2行目10が16進数で16のオフセットで始まる理由です。2バイト表現は、システムのエンディアンに依存します。man hexdump詳細を入力します。
ミゲルモリン

26

別のオプションはodです:

od -t x1 FILE

または

od -x FILE

od 微調整のための多くのオプションがあります。


9
ほとんどの人は、od -t x1私が推測する優先形式を見つけるでしょう。
アレックス

ラインについてはod -t test私が得たod: invalid character 't' in type string 'test'
トム・ブリト

それはと働いた--t
トム・ブリト

@Tom:たぶん別のUnix / Linuxフレーバーですか?私のodは:od --version od (GNU coreutils) 7.4
ユーザー不明

12

我々は上にいる間odhexdump、さらに2つの同様のツール:

  • hd(bsdmainutilsから)
  • xxd(Vimの一部)

サンプル出力:

$ hd /usr/bin/od | head
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  20 8e 04 08 34 00 00 00  |........ ...4...|
00000020  a4 a2 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1b 00 1a 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080  00 80 04 08 c4 9d 00 00  c4 9d 00 00 05 00 00 00  |................|
00000090  00 10 00 00 01 00 00 00  00 a0 00 00 00 20 05 08  |............. ..|

$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000  ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800  ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408  ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408  ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000  4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000  ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508  ............. ..

または、バイトを一度に1つずつ読み取り、独自の形式で印刷する場合は、次のようなものを試してください。

while read -n 1 byte; do
    ord=$(printf "%b" "${byte:-\000}" |
          od -t x1 |
          { read offset hex; echo $hex; })
    echo "$ord"
done </usr/bin/od

サンプル出力:

7f
45
4c
46
01
01
01
00
00
00

3
他とは異なり、xxdは変更を元に戻すこともできます。これにより、シェルでバイナリファイルを変更することができます。
オフィルモ

2
あなたのwhileループは、バックスラッシュと(空白文字のため)は、ksh93に反対し、bashで(よう)改行文字では動作しません。また、8番目のビットがセットされたバイト用のutf8ロケールで正しく動作します。また、あなたが使用することができ、そこに「OD」を必要としないprintf '%02x\n' "'$byte"
ステファンChazelas

注:ここでoffsetは単なる「ダミー変数」の一種です。実用的ではありません。にアクセスするためのプレースホルダーとして使用されhexます。これは、read変数が青から外れて、読みやすさにマイナスの影響を与える場合があります。
構文エラー14

おそらく。しかし、この場合、$offsetサブシェルによってスコープが制限されるため、問題とは見なされません。
ミケル14

4

私の2セント:

tail -f streamfile | hexdump -C

hexdumpをライブで見ることができる間、現在バッファリングしているファイルをテーリングしているので、私はこれが好きです。Unixの内のそのすべてがファイルであることを忘れないでください、私たちは次のようにコマンドを簡単に連鎖することができますtailし、hexdump問題を幅広く解決します。


テスト済みでfor((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&thxの監視に適しています:)
Aquarius Power 14年

3
mc 

真夜中の司令官は別のオプションです。すべてのUNIXフレーバーで使用できるかどうかはわかりません。最初にダウンロードする必要があるかもしれません。
F3 F4内部エディタ/ 16進モードで表示します。


0

バイナリファイル内のテキストを検索する必要がある場合、odをcおよびx1で使用します。

$ echo "Some text..." | od -t c -t x1
0000000   S   o   m   e       t   e   x   t   .   .   .  \n
         53  6f  6d  65  20  74  65  78  74  2e  2e  2e  0a
0000015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.