odコマンドは、ファイルをバイナリとして表示することができます。
問題によって、ファイルのバイナリを確認することで解決することもあります。
odコマンドとは
odコマンドは、デフォルトで入力ファイルを8進数表示で出力します。
オプションを用いることで、表示するバイナリデータを分かりやすくすることもできます。
odコマンドは、非表示文字を確認する、バイナリファイルのヘッダを確認するなどを行うことができ、トラブルシュートを行うときに利用できるコマンドです。
odコマンド利用例
8進数でバイナリを表示
(オプションなし)
odコマンドをオプションなしで、利用すると8進数(octal)形式で表示を行います。
また、一番左の列にある数字はオフセットであり、バイナリデータのアドレスになります。
このオフセットもデフォルトでは8進数形式で表示されます。
コマンド例
1 |
od test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
0000000 062550 066154 020157 067567 066162 020544 005041 062550 0000020 066154 020157 064163 066145 020554 005041 062550 066154 0000040 020157 060542 064163 020441 000012 0000051 |
オフセットの基数を変更
(-Aオプション)
-Aオプションは、一番左にある列のオフセットの基数を変更または非表示にすることができます。
基数のデフォルトは8進数で変更できる基数は以下のようになります。
変更できる基数
記号 | 意味 |
d | 10進数(decimal) |
o | デフォルト:8進数(octal) |
x | 16進数(hexadecimal) |
n | 非表示(none) |
オフセットの10進数表記
一番左の列のオフセットが10進数表記になります。
コマンド例
1 |
od -A d test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
0000000 062550 066154 020157 067567 066162 020544 005041 062550 0000016 066154 020157 064163 066145 020554 005041 062550 066154 0000032 020157 060542 064163 020441 000012 0000041 |
オフセットの16進数表記
一番左の列のオフセットが16進数表記になります。
コマンド例
1 |
od -A x test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
000000 062550 066154 020157 067567 066162 020544 005041 062550 000010 066154 020157 064163 066145 020554 005041 062550 066154 000020 020157 060542 064163 020441 000012 000029 |
オフセットの非表示
一番左の列のオフセットが非表示になります。
コマンド例
1 |
od -A n test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 |
062550 066154 020157 067567 066162 020544 005041 062550 066154 020157 064163 066145 020554 005041 062550 066154 020157 060542 064163 020441 000012 |
エンディアンの変更
(--endianオプション)
--endianオプションは、入力バイトの順番をビックエンディアンまたはリトルエンディアンに変更することができます。
オプションに指定できる文字は、「little」または「big」になります。
リトルエンディアン
コマンド例
1 |
od --endian=little test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
0000000 062550 066154 020157 067567 066162 020544 005041 062550 0000020 066154 020157 064163 066145 020554 005041 062550 066154 0000040 020157 060542 064163 020441 000012 0000051 |
ビックエンディアン
コマンド例
1 |
od --endian=big test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
0000000 064145 066154 067440 073557 071154 062041 020412 064145 0000020 066154 067440 071550 062554 066041 020412 064145 066154 0000040 067440 061141 071550 020441 005000 0000051 |
入力バイトをスキップ
(-jオプション)
-jオプションは、入力ファイルの出力を指定したバイト数だけスキップすることができます。
-jオプションを用いる場合、10進数表記のほかに8進数表記や16進表記を用いることができます。
例えば、16バイトをスキップするとしたら、10進数表記で「16」、16進数表記で「0x10」、8進数表記で「020」というように、16進表記では接頭辞として0xを、8進数表記では接頭辞として0をつけます。
また、接尾辞としてKやMの文字を用いることができます。
よく使われる接尾辞
接尾辞 | 数値 | |
b | 512 | blocks |
KB | 1000 | kiloBytes |
K | 1024 | KibiBytes |
MB | 1000*1000 | MegaBytes |
M | 1024*1024 | MebiBytes |
GB | 1000*1000*1000 | GigaBytes |
G | 1024*1024*1024 | GibiBytes |
コマンド例
1 |
od -j'020' test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
スキップする前のバイナリデータ
1 2 3 4 |
0000000 062550 066154 020157 067567 066162 020544 005041 062550 0000020 066154 020157 064163 066145 020554 005041 062550 066154 0000040 020157 060542 064163 020441 000012 0000051 |
実行結果
1 2 3 |
0000020 066154 020157 064163 066145 020554 005041 062550 066154 0000040 020157 060542 064163 020441 000012 0000051 |
出力バイト数を指定
(-Nオプション)
-Nオプションは、出力バイト数を指定することができます。接頭辞や接尾辞の指定は、-jオプションと同じなります。
コマンド例
1 |
od -N'020' test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 |
0000000 062550 066154 020157 067567 066162 020544 005041 062550 0000020 |
また、-jオプションと併用することができます。
コマンド例
1 |
od -N'020' -j'020' test.txt |
実行結果
1 2 |
0000020 066154 020157 064163 066145 020554 005041 062550 066154 0000040 |
バイナリファイルに含まれる文字列を表示
(-Sまたは--strings)
-Sまたは--stringsオプションは、C言語の実行ファイル等のバイナリファイルに含まれる文字列を表示することができます。
-Sまたは--stringsオプションの引数として、バイトを指定します。
このバイト数は、バイナリファイルに含まれる文字列が少なくとも指定したバイト数以上の連続するASCII文字ならば表示するという意味になります。
-Sオプションの場合はバイト数を必ず指定しなければなりませんが、--stringsオプションの場合はバイト数を指定しなければ、デフォルトとして3が指定されます。
コマンド例
1 |
od --strings a.out |
または
1 |
od -S3 a.out |
a.outの作成に使用したソースコード(hello.c)
1 2 3 4 5 6 |
#include <stdio.h> int main(void){ printf("hello world"); return 0; } |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
0001070 /lib64/ld-linux-x86-64.so.2 0001140 GNU 0001200 GNU 0001431 libc.so.6 0001443 printf 0001452 __libc_start_main 0001474 __gmon_start__ 0001513 GLIBC_2.2.5 0002704 hello world 0003157 ;*3$" 0010070 GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 0013271 crtstuff.c 0013304 __JCR_LIST__ 0013321 deregister_tm_clones 0013346 __do_global_dtors_aux 0013374 completed.7585 0013413 __do_global_dtors_aux_fini_array_entry 0013462 frame_dummy 0013476 __frame_dummy_init_array_entry 0013535 hello.c 0013545 __FRAME_END__ 0013563 __JCR_END__ 0013577 __init_array_end 0013620 _DYNAMIC 0013631 __init_array_start 0013654 __GNU_EH_FRAME_HDR 0013677 _GLOBAL_OFFSET_TABLE_ 0013725 __libc_csu_fini 0013745 _ITM_deregisterTMCloneTable 0014001 _edata 0014010 printf@@GLIBC_2.2.5 0014034 __libc_start_main@@GLIBC_2.2.5 0014073 __data_start 0014110 __gmon_start__ 0014127 __dso_handle 0014144 _IO_stdin_used 0014163 __libc_csu_init 0014203 __bss_start 0014217 main 0014224 _Jv_RegisterClasses 0014250 __TMC_END__ 0014264 _ITM_registerTMCloneTable 0014317 .symtab 0014327 .strtab 0014337 .shstrtab 0014351 .interp 0014361 .note.ABI-tag 0014377 .note.gnu.build-id 0014422 .gnu.hash 0014434 .dynsym 0014444 .dynstr 0014454 .gnu.version 0014471 .gnu.version_r 0014510 .rela.dyn 0014522 .rela.plt 0014534 .init 0014542 .plt.got 0014553 .text 0014561 .fini 0014567 .rodata 0014577 .eh_frame_hdr 0014615 .eh_frame 0014627 .init_array 0014643 .fini_array 0014657 .jcr 0014664 .dynamic 0014675 .got.plt 0014706 .data 0014714 .bss 0014721 .comment |
表示するバイナリの形式を変更
(-tオプション)
-tオプションは、出力されているバイナリデータの表示方法を変更することができます。
利用できる記号の種類は以下の通りになります。
-tオプションで利用できる記号の種類
記号 | 意味 |
a | 文字表示(named character) |
c | 1バイト文字、Cのエスケープ文字、3桁の8進数で表示 |
d | 符号付き整数(signed decimal) |
f | 小数(floating point) |
o | 8進数(octal) |
u | 符号なし整数(unsigned decimal) |
x | 16進数(hexadecimal) |
-tオプションで利用できる記号の種類は複数回使用でき、使用した記号の順番で出力が行われます。
コマンド例は16進数で表示を行います。また、この表示はリトルエンディアンで表現されています。また、-tオプションに関しては他のコマンド例を別途後述します。
コマンド例
1 |
od -tx test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 |
0000000 6c6c6568 6f77206f 21646c72 65680a21 0000020 206f6c6c 6c656873 0a21216c 6c6c6568 0000040 6162206f 21216873 0000000a 0000051 |
aとc以外では、記号の次にデータ型を表す数字を指定するとそのデータ型で表示を区切ります。
コマンド例
1 |
od -tx1 test.txt |
実行結果
1 2 3 4 |
0000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 21 0a 68 65 0000020 6c 6c 6f 20 73 68 65 6c 6c 21 21 0a 68 65 6c 6c 0000040 6f 20 62 61 73 68 21 21 0a 0000051 |
数字の他には、Cコンパイラでの組み込みのデータ型でも指定を行うことができます。
データ型の種類
記号 | 意味 |
C | char |
S | short |
I | int |
L | long |
コマンド例
1 |
od -txC test.txt |
実行結果(-x1オプションの結果と同じ)
1 2 3 4 |
0000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 21 0a 68 65 0000020 6c 6c 6f 20 73 68 65 6c 6c 21 21 0a 68 65 6c 6c 0000040 6f 20 62 61 73 68 21 21 0a 0000051 |
浮動小数点表記のfの記号のためには、また別の浮動小数点用のデータ型を指定します。
データ型の種類(fの記号のための記号)
記号 | 意味 |
F | float |
D | double |
L | long double |
コマンド例
1 |
od -tfD test.txt |
実行結果
1 2 3 4 |
0000000 8.765776478827897e+228 3.117267556600339e+180 0000020 1.4413955147759899e+214 1.9119032805792773e+214 0000040 4.254429159354869e-149 5e-323 0000051 |
任意の記号の文字の最後にzをつけると、出力されたバイナリ形式の行に1バイト文字表現が追加されます。
コマンド例
1 |
od -tx1z test.txt |
実行結果
1 2 3 4 |
0000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 21 0a 68 65 >hello world!!.he< 0000020 6c 6c 6f 20 73 68 65 6c 6c 21 21 0a 68 65 6c 6c >llo shell!!.hell< 0000040 6f 20 62 61 73 68 21 21 0a >o bash!!.< 0000051 |
全ての行を表示
(-vオプション)
odコマンドは、同一の行を出力する場合、アスタリスクを表示して行の出力を省略します。
コマンド例
1 |
od test_vopt.txt |
test_vopt.txt
1 2 3 4 5 6 7 8 |
-vtestfilebegin hello world !!! hello world !!! hello world !!! hello world !!! hello world !!! hello world !!! -v test fileend |
実行結果
1 2 3 4 5 |
0000000 073055 062564 072163 064546 062554 062542 064547 005156 0000020 062550 066154 020157 067567 066162 020144 020441 005041 * 0000160 073055 072040 071545 020164 064546 062554 067145 005144 0000200 |
-vオプション用いると、省略しないように全ての行を表示します。
コマンド例
1 |
od -v test_vopt.txt |
実行結果
1 2 3 4 5 6 7 8 9 |
0000000 073055 062564 072163 064546 062554 062542 064547 005156 0000020 062550 066154 020157 067567 066162 020144 020441 005041 0000040 062550 066154 020157 067567 066162 020144 020441 005041 0000060 062550 066154 020157 067567 066162 020144 020441 005041 0000100 062550 066154 020157 067567 066162 020144 020441 005041 0000120 062550 066154 020157 067567 066162 020144 020441 005041 0000140 062550 066154 020157 067567 066162 020144 020441 005041 0000160 073055 072040 071545 020164 064546 062554 067145 005144 0000200 |
出力する行の幅を指定
(-wまたは--widthオプション)
-wオプションまたは--widthオプションは、数値を指定すると指定した数値の幅で出力行を表示します。
-wオプションまたは--widthオプションを指定しない場合のデフォルトは16になります。
また、--widthオプションの場合、数値を省略できます。その場合の数値は32になります。
コマンド例
1 |
od -w4 test.txt |
test.txt
1 2 3 |
hello world!! hello shell!! hello bash!! |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
0000000 062550 066154 0000004 020157 067567 0000010 066162 020544 0000014 005041 062550 0000020 066154 020157 0000024 064163 066145 0000030 020554 005041 0000034 062550 066154 0000040 020157 060542 0000044 064163 020441 0000050 000012 0000051 |
-tオプションの例
記号 a
named characterとして文字を表示します。
コマンド例
1 |
od -ta test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 c soh dc3 c stx dc3 c soh + c soh ! c soh / nl 0000020 h e l l o sp w o r l d ! ! nl 0000036 |
記号 c
1バイト文字、Cのエスケープ文字、3桁の8進数を用いて、出力します。
コマンド例
1 |
od -tc test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 343 201 223 343 202 223 343 201 253 343 201 241 343 201 257 \n 0000020 h e l l o w o r l d ! ! \n 0000036 |
記号 d
符号あり整数(signed decimal)で出力します。
また、記号の後にデータ型を表すバイト数を入力するとそのデータ型のバイト数を区切りとして表示を行います。
コマンド例
1 |
od -td test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 -476872221 -2115791998 -1585323093 179274211 0000020 1819043176 1870078063 560229490 2593 0000036 |
記号 f
小数表現(float)として出力します。
また、記号の後にデータ型を表すバイト数を入力するとそのデータ型のバイト数を区切りとして表示を行います。
コマンド例
1 |
od -tf test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 -1.4615816112636164e-299 3.278732621020022e-257 0000020 8.765776478827897e+228 5.5026118761177e-311 0000036 |
記号 o
8進数(octal)で出力します。
また、記号の後にデータ型を表すバイト数を入力するとそのデータ型のバイト数を区切りとして表示を行います。
コマンド例は、リトルエンディアンとして表現されています。リトルエンディアンかビックエンディアンかは、システムによって異なります。指定する場合は--endianオプションを使用してください。
コマンド例
1 |
od -to test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 34344700743 20170711602 24140361653 01253700743 0000020 15433062550 15735620157 04131066162 00000005041 0000036 |
記号 u
符号なし整数(unsigned decimal)として出力します。
また、記号の後にデータ型を表すバイト数を入力するとそのデータ型のバイト数を区切りとして表示を行います。
コマンド例
1 |
od -tu test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 3818095075 2179175298 2709644203 179274211 0000020 1819043176 1870078063 560229490 2593 0000036 |
記号 x
16進数(hexadecimal)で出力します。
また、記号の後にデータ型を表すバイト数を入力するとそのデータ型のバイト数として表示を行います。
コマンド例は、リトルエンディアンとして表現されています。リトルエンディアンかビックエンディアンかは、システムによって異なります。指定する場合は--endianオプションを使用してください。
コマンド例
1 |
od -tx test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 |
0000000 e39381e3 81e39382 a181e3ab 0aaf81e3 0000020 6c6c6568 6f77206f 21646c72 00000a21 0000036 |
複数の記号の使用
-tオプションに用いる記号は複数回用いることができます。-tオプションの後に記述された記号の順番に出力が行われます。
コマンド例は、文字表示(a)、1バイト区切りの8進数表記(o1)、1バイト区切りの16進表記(x1)を2回表示します。また、zの記号を任意の記号の後に記述することで、その記号で出力された行に対して、1バイト文字表現が追加されます。
コマンド例
1 |
od -tao1zx1x1z test2.txt |
test2.txt
1 2 |
こんにちは hello world!! |
実行結果
1 2 3 4 5 6 7 8 9 |
0000000 c soh dc3 c stx dc3 c soh + c soh ! c soh / nl 343 201 223 343 202 223 343 201 253 343 201 241 343 201 257 012 >................< e3 81 93 e3 82 93 e3 81 ab e3 81 a1 e3 81 af 0a e3 81 93 e3 82 93 e3 81 ab e3 81 a1 e3 81 af 0a >................< 0000020 h e l l o sp w o r l d ! ! nl 150 145 154 154 157 040 167 157 162 154 144 041 041 012 >hello world!!.< 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 21 0a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 21 0a >hello world!!.< 0000036 |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版