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

How do Binary Files works? (From c++'s point of view)

本文关键字:C++ 何工作 工作 二进制文件      更新时间:2023-10-16

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

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

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

C++编译器不是使用例程编写的,无法理解任何二进制文件编码。在C++中读取/写入二进制文件的例程只会读取和写入字节序列。虽然,由于在C++中保存一个字节数据的基本类型是 char(或无符号 char),你会看到二进制原型,如

write ( char * buffer, streamsize size );
 read ( char * buffer, streamsize size );

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

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

从 C/C++ 的角度来看,文本文件和二进制文件之间的唯一区别是如何处理行尾。

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

如果在文本模式下打开文件,则在读取文件时,通常用于表示文件中行尾的任何字符或字符序列都会转换为某个单个字符(在源代码中写为 'n' ,尽管它只是一个字符),并且在写入文件时n转换为常规的行尾字符或序列。此外,文件不以行尾序列结尾在技术上是不合法的,并且行的长度可能有限制。

在Unix中,这两种模式是相同的,因为n是字符代码10(十六进制0A)的表示,而这正是传统的行尾字符。相比之下,在Windows中,传统的行尾序列是两个字节长 - {13,10}{0D,0A}n仍然是0A,因此实际上0A前面的0D从从文件读取的数据中删除,并且在数据写入文件时,在每个0A之前插入一个0D

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

从技术上讲,文本文件是二进制的,因为所有文件实际上都是二进制文件。文本文件往往只存储文本字符,二进制文件存储任何可以想象的值 - 数字,图像,文本等。 例如,数字不是像"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 代码。