
$ echo "hello" | od
0000000 062550 066154 005157
0000006
我知道第一列代表位元組偏移量。但我不明白其他數字是如何形成的。根據man
上面應該是“八進位位元組”。然而,該選項-b
也應該“選擇八進位位元組”,並且它會列印出不同的內容:
$echo "hello" | od -b
0000000 150 145 154 154 157 012
0000006
編輯:順便說一下,這是我期望出現的內容,即“hello\n”中所有字元的ascii值,就像我期望的那樣被稱為“八進位位元組”。
答案1
od
預設不顯示字節,它顯示八進制的單字。這可能不太直觀,但不要od
忘記非常舊命令:-) 我將使用一個比您更簡單的範例:
$ echo -en '\01\02' | od
0000000 001001
0000002
由於英特爾使用小尾數法建築學,位元組\01\02
被解釋為00000010 00000001
二進制。
由於每個八進制數字代表 3 位,我們可以像這樣對該數字進行分組:
(0)(000)(001)(000)(000)(001)
所以這 2 個位元組的八進位表示為:
001001
對於日常使用來說,這是毫無用處的;也許在過去,手動調試記憶體轉儲很方便:-)
你的hello\n
例子是:
h = 01101000
e = 01100101
l = 01101100
l = 01101100
o = 01101111
\n= 00001010
現在有點複雜了,因為八進制數字代表3位,但位元組是8位;因此添加了填充:-( 結果象徵性地是:
PehPllP\no
請記住,由於位元組順序,每組 2 個位元組都會被交換。這磷是2位的填充。八進制結果是(使用斜線作為分隔符號):
00/01100101/01101000/00/01101100/01101100/00/00001010/01101111
現在是 3 位的八進位組:
000 110 010 101 101 000 000 110 110 001 101 100 000 000 101 001 101 111
翻譯成八進制數字:
062550066154005157
這與您的結果相符。
總而言之,您可能已經了解到,od
沒有選擇比無用更糟糕:-)