解释不带选项的八进制转储

解释不带选项的八进制转储
$ 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没有选择比无用更糟糕:-)

相关内容