我正在努力弄清楚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 一次读取两个字节,并且它不关心或不知道这两个字节实际上是两个单独的字符。