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)
由于歇斯底里的历史原因,od
默认打印两字节单词¹。
数字 020061(八进制)对应于两字节序列1?
(?
是一个空格字符)。为什么?如果使用十六进制会更清楚:0o20061 = 0x2031,?
ASCII 中为 0x20 (32) 和1
0x31 (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 以小字节序模式使用它。因此,您现在可能会遇到的大多数平台都是小端的。