为什么使用 vim 文本编辑器打开对象文件(Linux 中的 .o 文件)看起来乱码



当我们使用文本编辑器打开对象文件时,我们看到的符号是什么,它们(像@,..这样的符号(有什么意义吗?由于对象文件是二进制文件,我们希望看到 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的字节。有一个字符串实用程序可以从"二进制文件"中提取这种可打印的字节序列,并将它们解释为"文本"。请注意,有时这种解释会犯"错误",并将二进制数据解释为可打印的字符串,如此处所示。

最新更新