od 命令 :http://man.linuxde.net/od
od 命令
od命令用于將指定文件內容以八進制、十進制、十六進制、浮點格式或ASCII編碼字符方式顯示,通常使用od命令查看特殊格式的文件內容,或者用于顯示或查看文件中不能直接顯示在終端的字符。
od命令系統默認的顯示方式是八進制,名稱源于Octal Dump。
常見的文件為文本文件和二進制文件。此命令主要用來查看保存在二進制文件中的值。比如,程序可能輸出大量的數據記錄,每個數據是一個單精度浮點數。這些數據記錄存放在一個文件中,如果想查看下這個數據,這時候od命令就派上用場了。在我看來,od命令主要用來格式化輸出文件數據,即對文件中的數據進行無二義性的解釋。不管是IEEE754格式的浮點數還是ASCII碼,od命令都能按照需求輸出它們的值。
大家也可以了解一下hexdump命令,以十六進制輸出,但感覺 hexdump 命令沒有od命令強大。
Linux命令 hexdump?學習總結:http://www.cnblogs.com/kerrycode/p/5077687.html
注:常見的ASCII字符的十六進制表示
\r????? 0D
\n???? 0A
\t????? 09
DOS/Windows的換行符 \r\n 即十六進制表示 0D 0A
Linux/Unix的換行符????? \n??? 即十六進制表示 0A
選項?
-a:此參數的效果和同時指定“-ta”參數相同;
-A:<字碼基數>:選擇以何種基數計算字碼;
-b:此參數的效果和同時指定“-toC”參數相同;
-c:此參數的效果和同時指定“-tC”參數相同;
-d:此參數的效果和同時指定“-tu2”參數相同;
-f:此參數的效果和同時指定“-tfF”參數相同;
-h:此參數的效果和同時指定“-tx2”參數相同;
-i:此參數的效果和同時指定“-td2”參數相同;
-j<字符數目>或--skip-bytes=<字符數目>:略過設置的字符數目;
-l:此參數的效果和同時指定“-td4”參數相同;
-N<字符數目>或--read-bytes=<字符數目>:到設置的字符樹目為止;
-o:此參數的效果和同時指定“-to2”參數相同;
-s<字符串字符數>或--strings=<字符串字符數>:只顯示符合指定的字符數目的字符串;
-t<輸出格式>或--format=<輸出格式>:設置輸出格式;
-v或--output-duplicates:輸出時不省略重復的數據;
-w<每列字符數>或--width=<每列字符數>:設置每列的最大字符數;
-x:此參數的效果和同時指定“-h”參數相同;
--help:在線幫助;
--version:顯示版本信息。命令中各選項的含義:-A 指定地址基數,包括:d 十進制o 八進制(系統默認值)x 十六進制n 不打印位移值-t 指定數據的顯示格式,主要的參數有:c ASCII字符或反斜杠序列d 有符號十進制數f 浮點數o 八進制(系統默認值為02) u 無符號十進制數x 十六進制數
實 例:
[linuxde@localhost ~]$ echo abcdef g > tmp
[linuxde@localhost ~]$ cat tmp
abcdef g
說明:先準備一個tmp文件
[linuxde@localhost ~]$ od -b tmp
0000000 141 142 143 144 145 146 040 147 012
0000011
說明:使用單字節八進制解釋進行輸出,注意左側的默認地址格式為八字節
[linuxde@localhost ~]$ od -c tmp
0000000 a b c d e f g \n
0000011
說明:使用ASCII碼進行輸出,注意其中包括轉義字符
[linuxde@localhost ~]$ od -t d1 tmp
0000000 97 98 99 100 101 102 32 103 10
0000011
說明:使用單字節十進制進行解釋
[linuxde@localhost ~]$ od -A d -c tmp
0000000 a b c d e f g \n
0000009
說明:設置地址格式為十進制。
[linuxde@localhost ~]$ od -A x -c tmp
000000 a b c d e f g \n
000009
說明:設置地址格式為十六進制
[linuxde@localhost ~]$ od -j 2 -c tmp
0000002 c d e f g \n
0000011
說明:跳過開始的兩個字節
[linuxde@localhost ~]$ od -N 2 -j 2 -c tmp
0000002 c d
0000004
說明:跳過開始的兩個字節,并且僅輸出兩個字節
[linuxde@localhost ~]$ od -w1 -c tmp
0000000 a
0000001 b
0000002 c
0000003 d
0000004 e
0000005 f
0000006
0000007 g
0000010 \n
0000011
說明:每行僅輸出1個字節
[linuxde@localhost ~]$ od -w2 -c tmp
0000000 a b
0000002 c d
0000004 e f
0000006 g
0000010 \n
0000011
說明:每行輸出兩個字節
[linuxde@localhost ~]$ od -w3 -b tmp
0000000 141 142 143
0000003 144 145 146
0000006 040 147 012
0000011
說明:每行輸出3個字節,并使用八進制單字節進行解釋
除了選項c以外的其他選項后面都可以跟一個十進制數n,指定每個顯示值所包含的字節數。
說明:od命令系統默認的顯示方式是八進制,這也是該命令的名稱由來(Octal Dump)。
但這不是最有用的顯示方式,用ASCII碼和十六進制組合的方式能提供更有價值的信息輸出。?
例如:
$ od - Ax - tcx1 wh5
用法示例
(1)設置第一列偏移地址以十進制顯示。
od
-Ad testfile
偏移地址顯示基數有:d for decimal, o for octal, x for hexadecimal or n for none。
(2)od命令不顯示第一列偏移地址。
od
-An testfile
(3)以十六進制輸出,默認以四字節為一組(一列)顯示。
od
-tx testfile
(4)以十六進制輸出,每列輸出一字節。
od
-tx1 testfile
(5)顯示ASCII字符和ASCII字符名稱,注意換行符顯示方式的區別。
[b3335
@localhost]
$ echo lvlv|od -a
0000000 l v l v nl
0000005
[b3335
@localhost]
$ echo lvlv|od -tc
0000000 l v l v \n
0000005
(6)以十六進制顯示的同時顯示原字符。
[b3335
@localhost]
$ echo lvlv|od -tcx1
0000000 l v l v \n
6c
76 6c
76 0a
0000005
(7)指定每行顯示512字節。
od
-w512 -tx1 testfile
(8)od命令輸出時去除列與列之間的空格符。?
當我們需要將文件內容顯示為十六進制,需要輸出連續的單個字節,每個字節以十六進制顯示。這時我們可以通過od命令將文件以單個字節為一組,十六進制輸出在同一行,并去除每個字節之間的空格。目前還不知道怎么通過指定od命令的相關選項去除列與列之間的空格,也許od命令本身并不支持。我的做法是:?
(8.1)使用-An不輸出偏移地址;?
(8.2)使用-v輸出時不省略重復的數據;?
(8.3)使用-tx1以單個字節為一組按照十六進制輸出,-w1每列輸出一個字節;?
(8.4)最后通過管道傳遞給awk的標準輸入,通過awk不換行輸出所有行,拼接為一行輸出。
具體命令如下:
od -An -w1 -tx1 testfile|awk '{for(i=1;i<=NF;++i){printf "%s",$i}}'
od、hexdump、xxd---進制查看工具
三個命令都可以像UltraEdit那樣以16進制的方式查看文件。hexdump的輸入格式最靈活,因為它有專門的參數指定格式, 常用選項 -C。od沒什么特點,od -x 和不帶選項的xxd差不多。xxd還可以通過-r選項把16進制表示的反轉換為正常的文件因為它默認的表示方式和UltraEdit最像:以位移開頭,然后每兩字節一組,每行最后有相應字節的文件顯示
提到linux/unix下的進制查看工具,不得不提到標題上的三個工具。三者之間我個人感覺hexdump在使用上最平易近人,和windows下的winhex接近。而xxd是可以看作是od的升級產品。且其-r選項把16進制表示的反轉換為正常的文件。比較像是ultraedit軟件的十六進制查看。而od作為老牌的進制查看工具,個人感覺使用上比較麻煩。且顯示方式上不如上面兩個工個。而本篇著重介紹下hexdump的用法。(之前在windos下有用過winhex,比較喜歡其顯示的方式。)
常用參數如果要看到較理想的結果,使用-C參數,顯示結果分為三列(文件偏移量、字節的十六進制、ASCII字符)。格式:hexdump -C binfile一般文件都不是太小,最好用less來配合一下。格式:hexdump -C binfile | less
示例一 比較各種參數的輸出結果
[root@new55 ~]# echo /etc/passwd | hexdump
0000000 652f 6374 702f 7361 7773 0a64
000000c
[root@new55 ~]# echo /etc/passwd | od -x
0000000 652f 6374 702f 7361 7773 0a64
0000014
[root@new55 ~]# echo /etc/passwd | xxd
0000000: 2f65 7463 2f70 6173 7377 640a /etc/passwd.
[root@new55 ~]# echo /etc/passwd | hexdump -C <== 規范的十六進制和ASCII碼顯示(Canonical hex+ASCII display )
00000000 2f 65 74 63 2f 70 61 73 73 77 64 0a |/etc/passwd.|
0000000c
[root@new55 ~]# echo /etc/passwd | hexdump -b <== 單字節八進制顯示(One-byte octal display)
0000000 057 145 164 143 057 160 141 163 163 167 144 012
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -c <== 單字節字符顯示(One-byte character display)
0000000 / e t c / p a s s w d n
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -d <== 雙字節十進制顯示(Two-byte decimal display)
0000000 25903 25460 28719 29537 30579 02660
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -o <== 雙字節八進制顯示(Two-byte octal display)
0000000 062457 061564 070057 071541 073563 005144
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -x <== 雙字節十六進制顯示(Two-byte hexadecimal display)
0000000 652f 6374 702f 7361 7773 0a64
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -v
0000000 652f 6374 702f 7361 7773 0a64
000000c
比較來比較去,還是hexdump -C的顯示效果更好些。
示例二 確認文本文件的格式
文本文件在不同操作系統上的行結束標志是不一樣的,經常會碰到由此帶來的問題。
比如Linux的許多命令不能很好的處理DOS格式的文本文件。Windows/DOS下的文本文件是以rn作為行結束的,而Linux/Unix下的文本文件是以n作為行結束的。[root@new55 ~]# cat test.bc
123*321
123/321
scale=4;123/321[root@new55 ~]# hexdump -C test.bc
00000000 31 32 33 2a 33 32 31 0a 31 32 33 2f 33 32 31 0a |123*321.123/321.|
00000010 73 63 61 6c 65 3d 34 3b 31 32 33 2f 33 32 31 0a |scale=4;123/321.|
00000020 0a |.|
00000021
[root@new55 ~]#
注:常見的ASCII字符的十六進制表示r 0D
n 0A
t 09
DOS/Windows的換行符 rn 即十六進制表示 0D 0A
Linux/Unix的換行符 n 即十六進制表示 0A
示例三 查看wav文件
有些IVR系統需要8K赫茲8比特的語音文件,可以使用hexdump看一下具體字節編碼。[root@web186 root]# ls -l tmp.wav
-rw-r--r-- 1 root root 32381 2010-04-19 tmp.wav
[root@web186 root]# file tmp.wav
tmp.wav: RIFF (little-endian) data, WAVE audio, ITU G.711 a-law, mono 8000 Hz[root@web186 root]# hexdump -C tmp.wav | less
00000000 52 49 46 46 75 7e 00 00 57 41 56 45 66 6d 74 20 |RIFFu~..WAVEfmt |
00000000 52 49 46 46 75 7e 00 00 57 41 56 45 66 6d 74 20 |RIFFu~..WAVEfmt |
00000010 12 00 00 00 06 00 01 00 40 1f 00 00 40 1f 00 00 |........@...@...|
00000020 01 00 08 00 00 00 66 61 63 74 04 00 00 00 43 7e |......fact....C~|
00000030 00 00 64 61 74 61 43 7e 00 00 d5 d5 d5 d5 d5 d5 |..dataC~........|
00000040 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 |................|
*
000000a0 d5 d5 d5 d5 d5 d5 d5 d5 d5 55 d5 55 d5 d5 55 d5 |.........U.U..U.|
000000b0 55 d5 d5 55 d5 55 d5 d5 55 d5 55 55 55 55 55 55 |U..U.U..U.UUUUUU|
000000c0 55 55 55 55 55 55 55 d5 d5 d5 d5 d5 d5 d5 d5 d5 |UUUUUUU.........|
總結
以上是生活随笔為你收集整理的Linux进制查看工具:od、hexdump、xxd的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。