【问题标题】:why does an object file(.o files in linux) look gibberish when opened with vim text editor?为什么使用 vim 文本编辑器打开目标文件(linux 中的 .o 文件)看起来像乱码?
【发布时间】:2017-01-21 19:16:03
【问题描述】:

当我们用文本编辑器打开目标文件时,我们看到的符号是什么,它们(像@,..这样的符号)有什么意义吗?由于目标文件是二进制文件,我们希望看到 1 和 0,但为什么我们会看到这些符号?

【问题讨论】:

  • 你误解了binary file这个词。和binary notation不一样

标签: linux vim operating-system system elf


【解决方案1】:

因为二进制文件包含二进制数据,而不是文本编辑器期望看到的 ASCII 数据。如何显示“不可打印”字符取决于编辑器。

在 Linux 上,如果您真的想查看 0 和 1,可以使用 od 转储其他格式(八进制、十六进制、二进制)的文件。

【讨论】:

  • “文本编辑器期望看到的 ASCII 数据”——没有“ASCII 数据”之类的东西。一路向下。
  • @EmployedRussian 您是否在认真地争论文本编辑器不会对数据进行某些解释?如果它只是“位”,那么 OPs 问题是非常公平的——你会期望它只显示 0 和 1...
【解决方案2】:

你看到的符号是caret notation 中的C0 Codes,它们代表非打印的 ASCII 字符。

.o files 不包含人类可读的文本,因此当 Vim 尝试将它们读取为 ASCII 时,它们看起来像是无稽之谈。

如果您希望将这些字符视为它们的组成字节(例如 <00> 而不是 ^@),请尝试 :set display+=uhex(另请参阅 :help display)。

【讨论】:

    【解决方案3】:

    由于目标文件是二进制文件,我们希望看到 1 和 0

    您的期望不正确。如果你想看到0和1,你需要使用一个显示0和1的工具。

    我找不到可以执行此操作的标准实用程序,也没有人真正希望看到 0 和 1,因为这样的显示会非常冗长。程序员更喜欢十六进制显示,它更紧凑。例如,十六进制值0xfd可以表示为以下0和1的序列:1111 1101

    注1:0和1的序列完全相同,表示方式不同。

    注意 2:您可以看到将数字表示为位很快就会失控:0xfffffffd1111 1111 1111 1111 1111 1111 1111 1101

    但为什么我们会看到这些符号?

    vim 编辑器解释 0 和 1 的序列为 ASCII 字符。例如,“A”的ASCII 代码为0x41,或以下0 和1 序列:0100 0001。完整的ASCIIhere

    为了更好地理解这一点,请在 vim 中创建一个文件 foo.txt,其中包含以下几行:

    AAAAaaaa
    BBBBbbbb
    

    然后通过以下方式运行这个文件:

    od -c foo.txt
    od -b foo.txt
    od -tx1 foo.txt
    cat foo.txt
    

    请注意,文件中包含的 0 和 1不会改变,但上述每个命令解释这些 0 和 1 的方式不同。

    回到你的二进制文件。

    所有文件包含一个字节序列。这些字节可以被不同的工具以不同的方式解释。

    当人们说“二进制文件”与“文本文件”时,他们通常的意思是后者包含 only 与可打印的ASCII 字符相关联的字节,而前者包含一些具有可打印ASCII字符的字节(二进制文件也包含对应于可打印ASCII的字节是很常见的。有一个strings实用程序可以提取这样的来自“二进制文件”的可打印字节序列并将它们解释为“文本”。请注意,有时这种解释会犯“错误”,并将二进制数据解释为可打印字符串,如 here 所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2022-06-11
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多