八进制2字节输出是如何从od计算出来的

八进制2字节输出是如何从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

答案1

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

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

Little-endian 顺序在这里不太自然,因为一种输出格式 ( -c) 打印字符,另一种 ( -o) 打印单词。每个单词都以通常的数字形式打印大尾数法符号(按照从左到右的阅读顺序,最高有效数字排在第一位)。这在十六进制中更加明显,其中字节边界在数字输出中清晰可见:

echo '1 text' | od -xc   
0000000 2031 6574 7478 000a
         1    t e  x t \n\0

如果您更喜欢以字节序列的形式查看文件,请使用od -t x1(或者hd如果有的话)。

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

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

答案2

有趣的问题。浏览手册页后,我发现 -o 打印八进制输出(od == 八进制转储),您附加的 c 也只打印关联的字符。单独使用 -o 会得到相同的数字。

查看输出,od 一次读取两个字节的数据。以前两个字符为例:

CHAR - OCTAL - BINARY
1      061     0011 0001
SPACE  040     0010 0000

当我们连接二进制值时答案就出来了(“1”在右边,空格在左边):

0010 0000 0011 0001

将此二进制值转换为八进制得到 020061,这就是 od 打印的内容。

现在,为什么?我认为重点是 od 一次读取两个字节,并且它不关心或不知道这两个字节实际上是两个单独的字符。

相关内容