【发布时间】:2017-01-21 19:16:03
【问题描述】:
当我们用文本编辑器打开目标文件时,我们看到的符号是什么,它们(像@,..这样的符号)有什么意义吗?由于目标文件是二进制文件,我们希望看到 1 和 0,但为什么我们会看到这些符号?
【问题讨论】:
-
你误解了
binary file这个词。和binary notation不一样
标签: linux vim operating-system system elf
当我们用文本编辑器打开目标文件时,我们看到的符号是什么,它们(像@,..这样的符号)有什么意义吗?由于目标文件是二进制文件,我们希望看到 1 和 0,但为什么我们会看到这些符号?
【问题讨论】:
binary file这个词。和binary notation不一样
标签: linux vim operating-system system elf
因为二进制文件包含二进制数据,而不是文本编辑器期望看到的 ASCII 数据。如何显示“不可打印”字符取决于编辑器。
在 Linux 上,如果您真的想查看 0 和 1,可以使用 od 转储其他格式(八进制、十六进制、二进制)的文件。
【讨论】:
你看到的符号是caret notation 中的C0 Codes,它们代表非打印的 ASCII 字符。
.o files 不包含人类可读的文本,因此当 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 字符。例如,“A”的ASCII 代码为0x41,或以下0 和1 序列:0100 0001。完整的ASCII 表here。
为了更好地理解这一点,请在 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 所示。
【讨论】: