当我们使用文本编辑器打开对象文件时,我们看到的符号是什么,它们(像@,..这样的符号(有什么意义吗?由于对象文件是二进制文件,我们希望看到 1 和 0,但为什么我们看到这些符号?
因为二进制文件包含二进制数据,而不是文本编辑器期望看到的 ASCII 数据。由编辑器决定如何显示"不可打印"字符。
在 Linux 上,如果您真的想看到 0 和 1,您可以使用 od
转储其他格式(八进制、十六进制、二进制(的文件。
看到的符号是插入符号表示法中的 C0 代码,它们表示非打印 ASCII 字符。
.o
文件不包含人类可读的文本,因此当 Vim 尝试将它们读取为 ASCII 时,它们看起来像是无稽之谈。
如果您希望将这些字符视为其组件字节(如 <00>
而不是 ^@
(,请尝试:set display+=uhex
(另请参阅:help display
(。
由于对象文件是一个二进制文件,我们希望看到 1 和 0
您的期望不正确。如果要查看 0 和 1,则需要使用显示 0 和 1 的工具。
我找不到可以做到这一点的标准实用程序,也没有人真的想看到 0 和 1,因为这样的显示会非常冗长。程序员更喜欢十六进制显示,它更紧凑。例如,十六进制值0xfd
可以表示为以下 0 和 1 序列:1111 1101
。
注1:这是完全相同的0和1序列,以不同的方式表示。
注2:您可以看到,将数字表示为位很快就会失控:0xfffffffd
1111 1111 1111 1111 1111 1111 1111 1101
但为什么我们会看到这些符号呢?
vim
编辑器将 0 和 1 的序列解释为ASCII
字符。例如,ASCII
"A"的代码是 0x41
,或以下 0 和 1 的序列:0100 0001
。完整的ASCII
表在这里。
为了更好地理解这一点,请在vim
中创建一个包含以下行的文件foo.txt
:
AAAAaaaa
BBBBbbbb
然后通过以下方式运行此文件:
od -c foo.txt
od -b foo.txt
od -tx1 foo.txt
cat foo.txt
请注意,文件中包含的 0 和 1 不会更改,但上述每个命令对这些 0 和 1 的解释不同。
返回到您的二进制文件。
所有文件都包含字节序列。不同的工具可以对这些字节进行不同的解释。
当人们说"二进制文件"与"文本文件"时,他们通常的意思是后者仅包含具有可打印ASCII
字符与之关联的字节,而前者包含一些具有不可打印ASCII
字符的字节(二进制文件通常还包含对应于可打印ASCII
的字节。有一个字符串实用程序可以从"二进制文件"中提取这种可打印的字节序列,并将它们解释为"文本"。请注意,有时这种解释会犯"错误",并将二进制数据解释为可打印的字符串,如此处所示。