od如何计算八进制2字节输出

the*_*wer 4 text-processing ascii od

我正在努力弄清楚od命令的八进制 2 字节输出是什么。我了解八进制输出(-b标志),但八进制 2 字节对我来说是个谜(-o

有人可以解释一下如何-o从 ASCII 计算结果吗?

下面是一个例子:

[root@localhost lpi103-2]# cat text1
1 apple
2 pear
3 banana
[root@localhost lpi103-2]# od -c text1
0000000   1       a   p   p   l   e  \n   2       p   e   a   r  \n   3
0000020       b   a   n   a   n   a  \n
0000030
[root@localhost lpi103-2]# od -bc text1
0000000 061 040 141 160 160 154 145 012 062 040 160 145 141 162 012 063
          1       a   p   p   l   e  \n   2       p   e   a   r  \n   3
0000020 040 142 141 156 141 156 141 012
              b   a   n   a   n   a  \n
0000030
[root@localhost lpi103-2]# od -oc text1
0000000  020061  070141  066160  005145  020062  062560  071141  031412
          1       a   p   p   l   e  \n   2       p   e   a   r  \n   3
0000020  061040  067141  067141  005141
              b   a   n   a   n   a  \n
0000030
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 9

由于歇斯底里的历史原因,od默认打印两字节单词¹。

数字 020061(八进制)对应于两字节序列1??是一个空格字符)。为什么?如果使用十六进制会更清楚:0o20061 = 0x2031,?ASCII 中为 0x20 (32) 和10x31 (49)。请注意,低位 (0x31) 对应于第一个字符,高位对应于第二个字符:od 以小端顺序组装单词,因为这恰好是您系统的字节序。²

这里的小端顺序不是很自然,因为其中一种输出格式 ( -c) 打印字符,另一种 ( -o) 打印单词。每个单词都以通常的big-endian表示法打印为一个数字(最重要的数字在我们从左到右的阅读顺序中排在最前面)。这在十六进制中更加明显,其中字节边界在数字输出中很明显:

echo '1 text' | od -xc   
0000000 2031 6574 7478 000a
         1    t e  x t \n\0
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢将文件视为字节序列,请使用od -t x1(或hd如果您有)。

¹ 曾几何时,男人是真正的男人,计算机是真正的计算机,数字通常是用八进制写的,单词是两个字节长。

² 所有 PC(x86、x86-64)都是小端的,就像Unix 开始的PDP-11 一样。ARM CPU 可以处理任一字节序,但 Linux 和 iOS 以小字节序模式使用它。因此,您现在可能会遇到的大多数平台都是小端的。