Linux od 命令詳細筆記

1 篇文章 0 订阅

——為力求能讓更多人能看懂,所以文章的敘述方式會顯得囉嗦一些,請別介意

 

od 命令通常用於將“非文本”數據以某種格式(八進位、十進位、十六進位或ascii字符等等),並規範以每個單位所用字節數(1Byte, 2Bytes?)。od 是 Octal Dump 的意思。 

 

最簡單的 "od {文件名}"命令形式會將文件中的內容以“八進位且當成 short 型(即雙字節)”的形式展現出來,我們用 info od 時,原話是這樣的:

By default, 'od' prints the offset in octal, and each group of file data is a C 'short int''s worth of input
printed as a single octal number.

我們先使用 echo ab > tmp 創建一個名為 tmp 的文件,且內容為 ab(當然系統會自動追加一個 \n 在同一行),再使用 od tmp 命令查看一下文件內容,結果是:

0000000 061141 000012
0000003

這裡的 061141 和 000012 其實是八進位製的 short 型整數,先來複習一下關於八進位的知識:

三個二進位數字可以表示一個八進位數字,也就是二進位的 000 ~ 111 可以表示八進位的 0 ~ 7。不過一個字節是八位,所以用八進位來表示的話會有點“不太準確”,因為3的整數倍不會是8。那麼要表示一個字節得用上3個八進位數,而3個八進位數其實是能表示 3 × 3 = 9 個二進位數的,也就是會“浪費”一部份的八進位數,所以實際這裡打印結果中每個單位的六個八進位數取值範圍並非通常的 0 ~ 777, 777(也就是 3 × 6 = 18 個二進位),因為此處打印出的結果中,每個單位是占用 2Bytes,二進位下的取值範圍是 0000 0000 0000 0000 ~ 1111 1111 1111 1111,而 1111 1111 1111 1111 所對應的八進位數是 177, 777。因此,此處結果中每個單位的這六個八進位數的最大值只會去到 177, 777。

綜上所述,結果中的 061141 當中其實包含了我們之前輸入的 ab。因為用八進位來表示一個字節會“不太準確”(不過打印結果時以單字節作為單位還是可以的)三個八進位不能很好地契合一個字節,所以我們先把 061141 轉成能完美契合兩個字節的的十六進位吧(一個十六進位能很好地表示4個二進位),也就是 0x6261。很明顯,0x61 對應的是 a,而 0x62 對應的是 b,符合 ascii 碼。那麼後面的 000012 表示的自然就是換行符 \n 了。(這裡也可以看出是採用了 little-endian 的字節排序方式)

而當我們使用了參數 -t 的時候,默認情況發生了改變:打印出的結果默認會以 int 型 作為單位,也就是輸入命令 od -t o tmp 的話,結果會是:

0000000 00002461141
0000003

這裡的結果 00002461141 表示了一個 int 型數據。為方便確認,將其轉成十六進位: 000A 6261,確實就是我們期望的信息。

如果我們想以單字節來作為單位的話,可以把命令改成:od -t o1 tmp(其實o1可以和t靠在一起),其中的 1 指示了結果以 1 個字節作單位,我們也可以改為其它數字;o 則指示了打印的是八進位結果。要打印十六進位結果的話只需把其中的 改為 即可:od -tx1 tmp

 

想打印出更多類型的結果?

只需要在上面的 -tx1 後追加希望打印的類型即可,譬如 od -tx1c tmp,表示既打印一份十六進位的以單字節為單位的結果,也打印一份 ascii 形式的結果,此處的結果為:

0000000  61  62  0a       # 十六進位形式且以單字節為單位的結果(受 x1 參數的影響)
          a   b  \n       # ascii 形式的結果(受 c 參數的影響)
0000003

如果你想的話,完全可以繼續追加你所希望打印出來的形式,譬如可以把命令寫成 od -t o1d1x1c tmp,那麼結果就是:

0000000  141  142  012
          97   98   10
          61   62   0a
           a    b   \n
0000003

在《鳥哥的 LINUX 私房菜》裡面,可以看到有這麼一種形式的參數:-t oCc。其實這裡大寫的 C 表示的就是以 ascii 字符為單位,也就是說,這個參數其實是等價於 -t o1c 的,大家可以試試看。除了 C 之外,我們還可以換成 S, I, L,分別對應著 short, int, long 型。當然,我們也可以用等價的數字來替換這些字母。

 

本文結束!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值