使用文本编辑器打开二进制文件时,为什么看不到二进制代码?


51

使用文本编辑器打开二进制文件时,为什么看不到二进制代码?例如,当我使用文本编辑器打开图像时,我看到一些奇怪的字符以及一些人类可读的字符。但图片应以二进制编码。


8
您期望什么?您认为应如何存档?
Nikodemus RIP 2011年

2
我不知道为什么更多的编辑者不提供二进制作为原始ASCII 1/0序列。
Xeoncross

7
@Xenocross:因为原始的0/1序列是无用的,所以对于手动解码来说太麻烦了,因为它们占用了大量的屏幕空间;十六进制显示通常更适合手动解码。通过一些培训,您可以快速轻松地将十六进制转换为二进制,反之亦然。
Lie Ryan

3
@Fiasco Labs:Pedantry:一个带有两位数字的十六进制数字 -00 到FF,转换为十进制0-255(8位代表2 ^ 8 = 256个可能的状态)。
Piskvor 2012年

1
@Piskvor-感谢您把它比我做的更好。deadbeef是一个带有8位数字的十六进制数字,用于记录。; ^)
Fiasco Labs

Answers:


83

二进制数据和文本数据不是分开的:它们只是data。这取决于使它们一个或另一个的解释。如果在文本编辑器中打开二进制数据(例如图像文件),则其中的大部分内容都没有意义,因为它不适合您选择的解释(作为文本)。

您所说的文本是可能文件内容的子集:以给定字符集转换为可读字符的数据。

例如,在ASCII中,您可以看到在128个“允许”值中,只有大约一半是字母和数字,30是标点符号,其余是控制字符。后者在文本文件中使用很少,并且它们没有很好的文本表示形式。其中一些是Tab换行符,文本编辑器已经需要在显示它们时发挥创造力。

一些文本编辑器具有显式显示空白的选项。然后,除了常规的格式设置行为(实际上也就是对这些字符的解释)之外,它们实际上将被绘制为字符。

纯ASCII仅解释128个值。用于存储此信息的字节每个都有256个可能的值,因此ASCII不允许一半的可能值。例如,这些字符用于特定于区域的字符集,例如Latin 1,但是在ASCII中,它们是未定义的。它们在只能处理ASCII的文本查看器中没有有用的表示形式。


二进制数据通常不解释为文本。因此,在这些文件中,通常会找到所有可能的字节值。其他所有内容都是浪费的(这就是您可以很好地压缩文本的原因)。图像文件格式很复杂,您通常不会将它们视为文本,因此它们不需要可读。

由于没有通用的数据解释(字符集)将所有可能的值映射到可读字符,并且由于无论如何这都没有意义(因为它不是可读文本),因此主要部分显示为乱码。


十六进制编辑器为数据选择不同的表示形式:它将每个字节显示为两个十六进制数字。它只是一种不同的表示形式,并且具有易于理解的字符集:所有256个可能的字节值都可以表示为两个十六进制数字。

由于二进制数据很容易映射到十六进制,反之亦然(4个二进制数字到一个十六进制数字/从一个十六进制数字映射),并且二进制数字每位数包含的信息很少,因此,除非有特定的说明,否则十六进制通常是人类阅读二进制数据的首选方式倾向于使用其他表示形式的原因。


一些文本编辑器可能具有十六进制编辑器模式,而某些启发式方法试图确定文件是文本文件还是二进制文件,并自动选择一种模式或另一种模式。但这可能很难解决,并不是文件的特定属性说明文件是一种还是另一种。


一些FTP客户端要求您指定将哪些文件结尾用于文本数据。然后,这些程序将更改文件内容以匹配您所连接的计算机的操作系统,因为Windows使用的行尾字符序列(CR/LF)与Linux和Unix(包括Mac OS X; LF)不同。


4
,LF咬了我很多次,以至于我不记得了。
surfasb 2011年

32

因为您已经在文本编辑器(而不是二进制编辑器)中打开了它。


22
如您所见,文本。
伊格纳西奥·巴斯克斯

1
文本以成对(字节)的十六进制数(0-f)表示。如果要使用二进制,请以无意义的零和一字符串将十六进制转换为二进制。十六进制更易于阅读,更容易理解。
Fiasco Labs

2
Gotta说:有人应该采取大胆的步骤来推出一个真正的二进制编辑器,并带有Ones和Zeros(然后可能是具有相关十六进制/字符/十进制转换的单独窗格),其唯一目的就是教这种东西。我知道他们不应该这样做,但是大众媒体和假装知道计算机的数学老师为渴望学习的孩子设置了所有期望错误。
ZJR

@ZJR:没有理由他们不应该这样做。许多十六进制编辑器的确允许您以二进制形式查看文件内容。程序员通常并不觉得它像十六进制视图那样有用,因此您对它的了解不多。
David Z

16

这与上下文和解释有关。您计算机中的是高低压模式或磁盘磁化区域的图案,这些图案只有在我们决定如何解释它们时才有意义。

在不同情况下,低-高-低-低-低-低-高模式可能表示客户订购咖啡的数字65(大写字母“ A”,天蓝色),日期为“ 3月”真的是第六名或其他任何东西。

在图形程序中打开图像文件时,它知道将其解释为图像,知道哪些图案指示图像格式,哪些图案指示图像大小,等等。

在文本编辑器中打开图像文件时,该文件被视为文本。这是一种非常简单的格式,非常接近计算机中实际发生的事情,但是仍然存在一些解释。具体来说,几乎每个模式都被解释为一个特定的字符,例如AZ之类的常规字符,但也包含一些奇怪的字符。一些模式不会显示为字符,而是被视为基本格式:换行符,制表符。

(这种情况由于诸如Unicode之类的东西和诸如UTF-8之类的文本编码而变得有些复杂,但是为了简单起见,在此不再赘述。)

在文本编辑器中打开二进制文件时,请注意不要进行更改,因为几乎所做的任何更改都会完全破坏文件内容的常规解释,即会破坏文件并使它无法使用。


3

作为简化示例,请考虑使用文本编辑器打开的图像文件。

图像是一个简单的国际象棋图案,正方形的宽度为3个像素,每个正方形之间的边界为1个像素。-重复三个黑色像素,一个灰色边框像素,三个白色像素,一个灰色边框像素。

该图像中的第一行将具有四次以下值:

Black    Black    Black    Gray     White    White    White    Gray
0x000000 0x000000 0x000000 0x7F7F7F 0xFFFFFF 0xFFFFFF 0xFFFFFF 0c7F7F7F

(在Hex中,而不是Binary中-Binary中的字符串将是长度的四倍-将0x7F替换为0b01111111)

如果在文本编辑器中加载该数据字符串,则会得到以下文本:

[Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Del] [Del] [Del] [Blank] [Blank] [Blank] [Blank] [Blank ] [空白] [空白] [空白] [空白] [Del] [Del] [Del]

这是因为0x00是Null值的ASCII代码,您需要写入3次才能获得黑色像素的值(无论如何使用24bit BMP),并且您有3个黑色像素。然后0x7F是Delete的ASCII代码,您需要进行3次操作才能获得灰色像素。尤其是0xFF,即使在扩展的ASCII码集中,也不是特别重要的ASCII码-您需要将其写入9次才能获得3个白色像素。完成后,您将获得三个删除以写入一个灰色像素。

显示它的另一种方式(可能更有用的解释)是相反的示例-在文本编辑器中打开文件时,为了得到零和一,您必须写什么文件?

当然,ASCII码为零和一!文本编辑器中的零不会存储为值为0的单个位,而是存储为8位,值为0b00110000或十六进制0x30

'0'的ASCII码为0x30,'1'的ASCII码为0x31,因此,如果要将象棋图案存储为零和一,则文件将如下所示:

text editor:
10101010
01010101
10101010
01010101

Stored data (ASCII values for '1', '0' and 'new line'):
0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x0D 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D  0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31

不仅如此,文件还有开始和停止以及元数据和所有其他种类的内容,但是总结课和对您问题的回答是:

除非文件的前8位为0b00110000,否则文本编辑器将不会写入“ 0”,因为这是字符“ 0”的ASCII码。除非文件的前8位为0b00110001,否则文本编辑器将不会写入“ 1”,因为这是字符“ 1”的ASCII码。


0

该编辑器不够聪明,无法判断某些文本是否有意义,因此,除非有特别要求,否则它将显示任何文件为文本,除非具有此功能。正如其他人指出的那样,某些编辑器具有显示十六进制的功能。


UltraEdit足够聪明-可以将此类文件切换为十六进制编辑模式。
Peter Mortensen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.