究竟什么是二进制数据的文本表示?

时间:2009-09-13 02:33:53

标签: text binary

有时当您下载具有错误mime类型的已编译二进制文件或例如在二进制文件上运行“more”命令时,由于缺少更好的术语,您会得到一堆“蹩脚”。

例如,这是我在OS X上使用gcc编译的一个非常简单的C程序从命令行运行“more”时看到的片段。

<94>^^^@^@ESC^@^@^@^^^A^@^@<A8>^^^@^@.^@^@^@^N^D^@^@^P ^@^@@^@^@^@^O^D^@^@^L ^@^@H^@^@^@^O^D^@^@^H ^@^@P^@^@^@^O
^D^@^@^@ ^@^@\^@^@^@^C^@^P^@^@^P^@^@p^@^@^@^O^A^@^@b^_^@^@y^@^@^@^O^D^@^@^D ^@^@<82>^@^@^@^O^A^@^@<B6>^^^@^@<88>
^@^@^@^O^A^@^@T^_^@^@<8D>^@^@^@^O^A^@^@T^^^@^@<93>^@^@^@^A^@^A^B^@^@^@^@<99>^@^@^@^A^@^A^B^@^@^@^@^L^@^@^@^M^@^@
^@ ^@dyld_stub_binding_helper^@__dyld_func_lookup^@dyld__mach_header^@_NXArgc^@_NXArgv^@___progname^@__mh_execute
_header^@_average^@_environ^@_main^@_sum^@start^@_exit^@_printf^@^@^@^@

有人可以用简单的术语解释为什么会这样吗?当文本编辑器或纯文本mime类型试图解释二进制数据时会发生什么? ^ @在这种情况下是否意味着什么?为什么会有一些文字和一些蹩脚的文字?这个二进制数据在文本中的表示方式是否有任何标准?为什么不简单1和0?

我可以在概念上理解ascii或unicode作为数字系统中字符的表示,可以简化为二进制1和0以及CPU理解的数字系统。但在更高的层面上,我试图了解二进制数据是什么。我想我想“看到抽象”,如果这是有道理的。

有没有办法在文本编辑器中以任何有意义的方式“看到”二进制数据?

8 个答案:

答案 0 :(得分:4)

文本和二进制文件之间确实没有显着差异,除了文件中使用的值范围。根据使用的代码页(ASCII,ANSI)将每个值转换为字符(在基本文本编辑器中)。

您正在看到字符“^ @”,因为该位置文件中字节的值为0(空字符)。 nul字符不可打印,因此程序越多,使用插入符号表示它。

您可以在十六进制编辑器中打开该文件,该编辑器是对二进制数据更敏感的文本编辑器。我对Mac软件不太熟悉,但可以在http://hexedit.sourceforge.net/下载免费的十六进制编辑器。

基本文本编辑器/查看器假设您使用它打开的任何内容都应该以纯文本形式阅读。

编辑:合并Mike Spross的更正:^ @。

答案 1 :(得分:4)

二进制文件和文本文件对于计算机来说都是一样的,毕竟它们都是0和1。您看到文件内容的方式取决于您用来查看它的程序 文本编辑器(尝试)将0和1解释为字符,并显示他们获得的字符,您可以将其视为文档。他们假设您提供的文件是包含ASCII字符的文本文件。但是,对于计算机文件通常不是这样,因为它们可以包含任何类型的二进制数据,这些数据不一定是ASCII字符。当发生这种情况时,一些文本编辑器会给你一个丑陋且不正确的文件数据表示(因为他们无论如何都不理解数据),而不是给你一个错误信息。 十六进制编辑器更像是极客的工具,因为它们还为您提供十六进制的计算机数据(与二进制文件相比,更易读的格式)。一些十六进制编辑器还会为您提供他们检测到的ASCII字符,因此事件更方便 Alex为您提供了一个非常酷的命令行工具,但是如果您想要一些GUI,使用“十六进制编辑器”的快速谷歌将为您提供太多许多软件来尝试。

答案 2 :(得分:3)

  

有没有办法“看到”二进制数据   文本中任何有意义的方式   编辑器?

我建议使用十六进制格式!例如,这些是在VIM中编辑二进制文件的建议......:

  

使用XXD

     

真正的二进制编辑器显示文本   两种方式:原样和十六进制格式。   您可以先在Vim中执行此操作   使用“xxd”转换文件   程序。这与Vim一起提供。第一   以二进制模式编辑文件:

     

vim -b datafile

     

现在将文件转换为十六进制转储   使用xxd:

     

:%!XXD

     

文字如下:

0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49  ....9..;..tt.+NI      
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30  K,.`.....b..4^.0      
0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9  7;'1.".....i.59. 
  

您现在可以查看和编辑文本   你喜欢。 Vim对待这些信息   作为普通文本。改变十六进制   不会导致可打印字符   改变,或其他方式   周围。最后将其转换回来   用:

     

:%!xxd -r

     

仅使用十六进制部分中的更改。   可打印文本部分的更改   权利被忽略了。

     

有关详细信息,请参阅xxd的手册页   信息。

答案 3 :(得分:1)

我建议在Unix系统上使用od命令。它不是文本编辑器,但它仍然适合分析文件的内容。如果大多数字符都是可打印的,则可以使用od -c file

LE:GNU od(1) man page

答案 4 :(得分:1)

  

有没有办法“看到”二进制数据   文本中任何有意义的方式   编辑器?

简而言之,没有。二进制数据绝对意味着什么,并且愚蠢的文本编辑器无法弄明白。 (事实上​​,即使是聪明的人也无法绝对肯定地解决这个问题。)

在Unix / Linux系统上处理此问题的常用方法是使用“file”命令行实用程序。这将查看文件的开头并应用启发式方法为您提供文件类型的“最佳猜测”。基于此,您将看到是否可以找到适当的工具来查看文件内容。如果您没有理解格式的查看器/编辑器/反编译器等,“od”实用程序可以以各种形式向您显示;例如十六进制,八进制,字符等等。

编辑:详细说明“二进制数据绝对意味着什么”:

  • 即二进制位模式 输出(比如说)编译器不能 区别于相同的 二进制位模式输出(比如说) 一些随机的用户定义应用程序。如上所述,理论上不可能区分没有不可逆转的外部过程知识的情况。

  • 识别二进制位模式 (例如,由“文件”程序完成)是 通常基于检测“魔数” 在文件的前几个字节中。所以,例如, 可执行脚本文件的“魔力”是“#!”在 前两个字节。如果你写一个应用程序 生成一个可能包含“#!”的二进制文件作为第一个 两个字符,这可能会导致“文件”给出错误的匹配, 并将二进制文件标记为脚本

因此,从理论和实践的角度来看,任何基于其内容的二进制文件类型的识别都是不确定

但即使某些二进制文件类型也无法解决问题。有些人必须为每个二进制文件类型编写一个转换器,它将提取并呈现文件的含义。对于某些文件类型,这些转换器/渲染器已经存在。例如,有许多形式的可执行代码文件格式的反汇编器/反编译器。但是对于所有二进制文件类型都不存在这样的转换器,并且存在的转换器通常是独立的应用程序,而不是您喜欢的文本编辑器的插件模块。

答案 5 :(得分:1)

数据的二进制表示(只有1和0)需要太多的屏幕空间。

Hex或ascii等价物更简洁,我们的大脑更喜欢这样。

我们应该将组合的hex / ascii显示(例如由od命令生成)视为尝试显示数据看起来像是十六进制数据的样子以及它看起来像是什么样的意思是文字。

但是,正如Stephen C所说,没有文本编辑器可以准确地确定字节的含义,因此它只提供了一个提示。

由用户查看显示并决定数据是文本还是二进制或两者的混合

二进制文件有时包含一些文本字符系列。特别是如果二进制文件是可执行文件并且必须产生输出。输出消息将作为文本字符序列存储在二进制文件中。能够看到二进制文件中的文本序列以及它们存储的位置非常有用。

答案 6 :(得分:1)

在计算机上,所有数据以二进制形式存储,包括文本文件。这意味着所有内容都使用二进制位存储。只有两个可能的二进制位:1和0。

文本文件需要区分两个以上不同的符号,因此它将一系列二进制位分组为更复杂的单元。例如,8位序列可以解释为一个ASCII字符(值范围从0到255)。

由于文本文件内部只是一系列二进制位(1和0),因此任何系列的二进制位都可以解释为文本文件。示例中的输出是尝试将可执行文件的二进制位解释为文本文件的结果。大多数字符都是垃圾(作为ASCII字符序列没有意义),但有些部分有意义,因为它们存储为ASCII字符串。

每种文件格式都包含二进制位代表的内容。对于可执行文件,它比简单的文本文件复杂得多,但可执行文件格式还包括存储ASCII字符串的部分,如文本文件。

如果使用十六进制编辑器查看文件,则可以同时查看文件的二进制表示和二进制的ASCII文本解释。请注意,二进制表示以更紧凑的形式显示数据:十六进制。 4个二进制位的序列用一个十六进制数字表示,范围从0到F.

答案 7 :(得分:0)

您可以将二进制文件视为图像:

Visualizing binaries with space-filling curves.