问题的所在: 在许多计算机科学领域

时间:2022-05-04 07:07:29

当想到所有文件都转换为 XML时,确实是一件功德。但是,这并非事实。仿照照旧还有大量的文件格局不是XML,甚至也不是ASCII。二进制文件仍然在网络中流传,储存在磁盘上,在应用措施之间通报。对比之下,在措置惩罚惩罚这些问题方面,它们比文本文件显得更有效率些。

在 C 和 C++ 中,读取二进制文件还是很容易的。除了一些开始符(carriage return)和结束符(line feed)的问题,每一个读到C/C++中的文件都是二进制文件。事实上,C/C++ 只知道二进制文件,以及如何让二进制文件像文本文件一样。当我们使用的语言越来越抽象时,我们最后使用的语言就不能直接、容易的读取创建的文件了。这些语言想要用它们本身奇特的方法来自动措置惩罚惩罚输出数据。


问题的地址:

在许多计算机科学范围,C 和 C++ 仿照照旧直接依照数据布局来储存和读取数据。在C和C++中,依照内存中的数据布局来读取和写文件,是十分简单的。在C中,你只需要使用fwrite()函数,并供给下列参数:一个指向你的数据的指针,报告它有几多个数据,一个数据有多大。这样,就直接用二进制格局把数据写成文件了。

如上所述的那样把数据写成文件,同时如果你也知道其正确的数据布局的话,那么也就意味着读取文件也很容易。你只要使用 fread() 函数,并供给下列参数:一个文件句柄,一个指向数据的指针,读取几多个数据,每一个数据的长度。 fread() 函数帮你把其余的事都做了。俄然,数据又回到了内存中。没有给与解析以及也没有东西模型的方法,它只是把文件直接的读到内存中。

在C和C++中,最大的两个问题就是数据对齐(structure alignment)和字节交换(byte swapping)。数据对齐指的是有时编译器会跳过数据中间的字节,因为如果措置惩罚惩罚器访谒到那些字节,就不再处于最优化状态下了,要花费更多的时间(一般情况,措置惩罚惩罚器访谒未对齐数据花费的时间是访谒对齐数据的两倍),花费更多的指令。因此,编译器要为了执行速度而进行优化,跳过了那些字节并从头进行排序。另一方面,字节交换指的是:由于差别措置惩罚惩罚器对字节排序的方法差别,需要对数据的字节从头排序的过程。


数据对齐

因为措置惩罚惩罚器能够一次措置惩罚惩罚更多的信息(在一个时钟周期内),所以它们但愿它们所措置惩罚惩罚的信息能以一种确定的方法摆列。大大都的 Intel 措置惩罚惩罚器使整数类型(32位的)的储存首地点能被4除尽(即:从能被4除尽的地点上开始储存)。如果内存中的整数不是储存在4的倍数的地点上的话,它们是不会事情的。编译器知道这些。因此当编译器遇到一个可能引起这种问题的数据时,它们就有下面三种选择。

第一种,它们可以选择在数据中添加一些无用的白空格符,这样可以使整数的开始地点能被4除尽。这是一种最遍及的做法。第二种,它们可以对字段从头排序,以便使整数处于4位的界限上。因为这样会造成其它有趣的问题,因此,这种方法较少使用。第三种选择是,允许数据中的整数不处于4位的界限上,但是把代码复制到一个合适的处所从而使那些整数处于4位的界限上。这种方法需要一些特别的时间花费,但是,如果必需压缩的话,那么它就很有用了。

以上所说的这些多半是编译器的细节问题,你用不着过多的担忧。如果你对写数据的措施和读数据的措施使用同样的编译器,同样的设定,那么,这些就弗成其为问题了。编译器用同样的要领来措置惩罚惩罚同样的数据,一切都OK。但是当你涉及到跨平台文件转换问题时,用正确的方法来摆列所有数据就显得很重要了,这样才华保证信息能被转换。此外,一些措施员还了解怎样让编译器不用理睬他们的数据。

字节交换(byte swapping):高位优先(big endians)和低位优先(little endians)

高位优先和低位优先,指的是两种差此外方法,把整数储存在计算机中的的方法。因为整数是多于一个字节的,那么,问题在于:最重要的字节是否应该首先被读写。最不重要的字节是变革的最频繁的。这就是,如果你不停给一个整数加一,最不重要的字节要转变256次,次不重要的字节才只变革一次。

差此外措置惩罚惩罚器用差此外方法储存整数。Intel 措置惩罚惩罚器一般用低位优先方法来储存整数,换句话说,低位首先被读写。大大都其它措置惩罚惩罚器用高位优先方法来储存整数。因此,当二进制文件在差别平台上读写时,你就有可能不得不同错误字节从头排序以便得到正确的挨次。

在 UNIX 平台上,还有一种特殊的问题,因为UNIX可以在Sun Sparc措置惩罚惩罚器、HP措置惩罚惩罚器、IBM Power PC、Inter的芯片等多种措置惩罚惩罚器上运行。当从一种措置惩罚惩罚器转移到另一种措置惩罚惩罚器上时,就意味着那些变量的字节摆列挨次必需翻转,以便于它们能满足新措置惩罚惩罚器所要求的挨次。


用 C# 措置惩罚惩罚二进制文件