二进制文件如何工作? (从c ++的角度来看)

时间:2014-11-16 02:50:56

标签: c++ file parsing binary

我对二进制文件有一些误解,我不明白二进制文件是什么,我知道文本文件也是二进制文件,但需要解析以提取信息,不像文本文件具有相同内容的二进制文件看起来不同,例如将我的名字存储在二进制文件中时#34; Rishabh"它不仅将Rishabh存储在该文件中,而且还有一些额外的不可读字符,它是什么?为什么它只存储像文本文件这样的字符,以及什么是二进制文件格式,例如。 .3d,.zip,.mp3等...根据我对文本文件的了解,格式扩展指定格式是什么或如何处理该文件,如.dae,.xml,.htm等...这些包含标签到存储数据,但二进制文件呢,因为它不需要任何标签,因为它存储为该文件中的变量,我们必须将内容复制到程序变量,(我的意思是说它像存储在内存中)所以为什么这些二进制文件格式是不同的,为什么不只是一个程序读取文件的所有内容,这是世界上未知的和我?什么是二进制文件格式破解?

3 个答案:

答案 0 :(得分:2)

所有文件都有某种预先确定的编码,因为计算机无法在磁盘上以字节为单位存储任何位模式。文本文件仅包含可打印字符和空格的编码,以及一些其他编码方式,包括端到端,制表符,也可能是换页符以及与设备上的字符显示相关的其他一些编码。因为文本文件中的编码是众所周知的标准,并且很常见,所以在大多数(如果不是所有语言)中都有功能专门处理该类型的文件。最重要的是,他们知道如何一次读取一行 - 他们识别行终止符。

但是,如果您在文本编辑器之外的其他程序中键入名称的字符 - 比如您使用Gimp或Microsoft Paint中的文本工具编写,然后保存它。该程序必须保存更多信息,而不仅仅是您的名字。您的名字在画布上有一个必须保存的位置。它还有一个字体和大小,无论是粗体还是斜体或下划线,都需要保存。需要保存画布的大小。即使是白色和黑色,也需要保存使用的颜色。此编码与用于保存名称字母的编码不同。因此,如果您使用文本编辑器编辑文件,您会看到一些乱码,因为文本编辑器期待字符编码,并且对Gimp用于字体,字体大小,x,y位置等的编码一无所知。

C ++编译器不是用例程来编写来理解任何二进制文件编码的。用C ++读/写二进制文件的例程只会读写字节序列。虽然,因为在C ++中保存一个字节数据的基本类型是char(或unsigned char),你会看到像

这样的二进制原型
write ( char * buffer, streamsize size );
 read ( char * buffer, streamsize size );

但是在这种情况下,char指针应该被视为“byte *”,因为读/写函数只是将数据字节从/向磁盘或内存移动而不考虑字符编码。

C ++读/写例程不知道,或者关心它们正在移动的字节的格式或编码。因此,程序员需要根据文件的预定义格式编写代码来处理或处理这些字节。但是,为处理特定格式的二进制文件而编写的例程可以编译成一个库,然后可以共享或出售,并由许多C ++程序员使用。例如,LibXL可用于从C ++程序读取Excel文件的二进制格式。

答案 1 :(得分:2)

从C / C ++的角度来看,文本和二进制文件之间只有 的区别在于如何处理行结尾。

如果以二进制模式打开文件,则read会准确读取文件中的字节,而write会准确写入内存中的字节。

如果以文本模式打开文件,那么通常用于表示文件中行结尾的任何字符或字符序列都会转换为某个单个字符(在源代码中写为{{1}读取文件时,虽然只有一个字符,但在写入文件时,'\n'会转换为传统的行尾字符或序列。此外,文件不以行尾序列结束在技术上是合法的,并且行的长度可能有限。

在Unix中,两种模式是相同的,因为\n是字符代码10(十六进制为\n)的表示,而这恰恰是传统的行结束字符。相反,在Windows中,传统的行结束序列长度为两个字节 - 0A{10,13}{0A,0D}仍为\n,因此从文件中读取的数据中有效删除0A后的0D,并在每0A后插入0D数据写入文件时{1}}。

一些(多)较旧的操作系统根本没有传统的行结尾字符;相反,所有行都用空格字符填充到完全相同的长度,从而可以直接寻找特定的行号。在文本模式下工作的C库通常会读取完整的行长度,然后删除尾随空格并添加与0A对应的代码(某些此类系统使用EBCDIC而不是ASCII,因此\n为一个不同的整数值)。写出数据时,\n将被删除并替换为正确的空格数,以使该行达到标准长度。幸运的是,我们这些不在计算机博物馆工作的人不再需要处理这些东西,而且苹果放弃使用\n作为线端序列随之出现OSX,因此文本/二进制差异现在仅限于Windows。

答案 2 :(得分:1)

技术上文本文件是二进制的,因为所有文件都是二进制文件。文本文件往往只存储文本字符,二进制存储任何可能的值 - 数字,图像,文本等。例如,数字不存储在十进制表示法中,如“1234”,它们将使用0和1存储为二进制只要。有几种方法可以做到这一点(取决于您的操作系统),因此相同的数字可能看起来像一组0和1。例如0001110101011等。如果你在记事本中打开二进制文件,它会尝试将所有内容显示为文本,而你所看到的也是一些垃圾,这是以二进制表示的其他数据。

破解二进制文件格式确切地知道文件的每个字节中存储了哪些信息...有时文本,数字,数组,类,结构......真的。根据经验,人们可以慢慢找出什么是什么,但那是非常先进的东西!

有时,信息(格式)可以免费获取并且易于理解,或者像MS Word文档的格式一样需要遵循噩梦。 (MS Word格式是免费提供的,但由于向后兼容性而被认为是非常复杂的......尽管如此,使用格式文档可以“破解”二进制文件格式并确切地知道所有二进制文件代表的内容)

它是计算机系统的基础之一。

这个链接可能是一个很好的解释

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/asciiBin.html

引用了一些文字:

  

尽管ASCII文件是二进制文件,但有些人将其视为二进制文件   不同种类的文件。我觉得ASCII文件很特别   各种二进制文件。它们是写入每个字节的二进制文件   用ASCII码。

     

完整的通用二进制文件没有此类限制。任何256   位模式可以用在二进制文件的任何字节中。

     

我们一直使用二进制文件。可执行文件,目标文件,   图像文件,声音文件和许多文件格式都是二进制文件。什么   使它们二进制只是二进制文件的每个字节的事实   可以是256位模式之一。它们不限于ASCII   码。