二进制和文本文件的比较
一).一般问题
二进制文件与我们通常使用的文本文件储存方 式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的 编辑器有很多,在我们的CVF 附带的集成开发环境下就可以(将二进制文件拖动到 IDE 窗口后松开)。Visual Studio 2005 也是 可以的。(不过需要在 File 菜单下 Open,File)
另外推荐一款使用较多的软件,叫做UltraEdit(以下简称 UE)。是很不错的文本编辑器,也能做十六进制编辑器使用。
为什么要用十六进制编辑器?而不用2 进制呢?因为 2 进制实在太小,书写起来会很长,很不直观。而我们的计算机把 8 位作为一个字节。刚 好 2 ** 8 = 256 = 16 ** 2。用 8 位 2 进制表达的数,我们用 2 个十六进制数据来表达,更直观和方便。
二).文件格式
所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。
1).文本文件
文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。所以使用比较广泛。通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或Tab 间隔,行是用回车和换行符间隔。
以ANSI 编码(使用较多)的文本文件来说,例如我们储存如下信息:
需要的空间是:3行 × 每 行 2 个字符 + 2 个回车符 + 2 个换行符 = 10 字节。文本文件储存数据是有格式,无数据类型的。比如 10 这个数据,并不指定是整型 还是实型还是字符串。它有长度,就是 2,两个字节。储存时计算机储存它的 ASCII 码:31h,30h。(十六进制表示)。回车符是:0Dh,换行 符:0Ah。
因此,这个数据储存是这样的:
(红色为回车符和换行符)31h 30h 就是 10,31h 31h 就是 11,31h 32h 就是 12。因此我们也可以认为文本文件是特殊的二进制文件。
2).二进制文件
二进制文件,是无格式有数据类型的。比如上面的10 11 12 三个数。但二进制文件没有行的概念。我们要紧凑地储存他们。(当然也可以中间加入一些空白的字节)
从数据类型上来说,我们首先考虑整型。如果把10 11 12 当作 2 字长的整型。则 10 表示为:0Ah 00h。因为 0Ah 对应十进 制 10。而后面的 00h 是空白位。2 字长的整型如果不足 FFh,也就是不足 255,则需要一个空白位。类似的:11 表示 为 0Bh 00h,12 表示为 0Ch 00h。
当整型数据超过255 时,我们需要 2 个字节来储存。比如 2748(ABCh),则表示为:BCh 0Ah。要把低位写在前面(BCh),高位写在后面(0Ah)。
当整型数据超过65535 时,我们就需要 4 个字节来储存。比如 439041101(1A2B3C4Dh),则表示成:4Dh 3Ch 2Bh 1Ah。当数据再大时,我们就需要 8 字节储存了。
二进制文件的实型数据也有字节长度的区分,比如4 字长,8 字长。但实型数据的长度并不仅仅代表它的表达的范围,更多的代表精度。所以,8 字长的 我们又称为双精度。关于实型数据如何储存为 2 进制。则有很多套规则。现在都广泛使用的是 IEEE 标准浮点格式。关于这样的规则,我还正在了解,比 较麻烦。就不多说了。在这里也没有必要了解。
二进制文件也可以储存字符型数据,储存方法和文本文件一样。都是使用ASCII 编码储存的。所以我们用记事本打开某些二进制文件时,也能看到一些有意义的字符串。(无意义的乱码我们可以认为是整型或实型,不过记事本程序当作字符来解释,因此造成了乱码)
三).使用二进制文件的好处
为什么要使用二进制文件。原因大概有三个:
第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存Real*4 的 数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需 要 4 个字节(DB 0F 49 40)
第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。
第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。
四).二进制文件的储存方式
列举一个二进制文件如下:
这里列出的是在UltraEdit(UE) 里看到的东西。其实只有红色部分是文件内容。前面的是 UE 加入的行号。后面的是 UE 尝试解释为字符型的参考。
这个文件一共有32 字节长。显示为两列,每列 16 个字节。实际上,这仅仅是 UE 的显示而已。真实的文件并不分行。仅仅知道这个文件的内容,如果我们没有任何说明的话,是不能看出任何有用信息的。
下面我规定一下说明:我们认为,前4 个字节是一个 4 字节的整型数据(0F 01 00 00 十六进制:10Fh 十进制:271)。 这 4 个字节之后的 4 个字节是另一个 4 字节的整型数据(0F 03 00 00 十六进制:30Fh 十进制:783)。其后的 4 个字节 (12 53 21 45 )表示一个 4 字节的实型数据:2.5811919E+3。再其后的 4 个字节(58 62 35 34)表示另一 个 4 字节的实行数据:1.6892716E-7。而只后的 16 个字节 (41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我们认为是 16 个字节的字符串 (ABCDEFGHIGKLMNOP)
实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第9 字节到第 16 字节 (12 53 21 45 58 62 35 34),我们刚才认为是 2 个 4 字节的实型,其实也可以认为是 8 个字节的字符型( S!EXb54)。而后面的 16 个字节的字符串(ABCDEFGHIGKLMNOP),我们也可以认为是 2 个 8 字节的整型,或 者 4 个 4 字节的整型,甚至 2
二进制文件与我们通常使用的文本文件储存方 式有根本的不同。这样的不同很难用言语表达,自己亲自看一看,理解起来会容易得多。因此,我推荐学习二进制文件读写的朋友安装一款十六进制编辑器。这样的 编辑器有很多,在我们的
另外推荐一款使用较多的软件,叫做
为什么要用十六进制编辑器?而不用
二).文件格式
所有文件,笼统意义上将可以区分为两类,一类是文本文件,一类是二进制文件。
文本文件用记事本等文本编辑器打开,我们可以看懂上面的信息。所以使用比较广泛。通常一个文本文件分为很多很多行,作为数据储存时,还有列的概念。实际上,储存在硬盘或其他介质上,文件内容是线一样储存的,列是用空格或
以
引用:10
11
12
需要的空间是:3
引用:3130 0D 0A 31 31 0D 0A 31 32
(红色为回车符和换行符)
二进制文件,是无格式有数据类型的。比如上面的
从数据类型上来说,我们首先考虑整型。如果把
当整型数据超过
当整型数据超过
二进制文件的实型数据也有字节长度的区分,比如
二进制文件也可以储存字符型数据,储存方法和文本文件一样。都是使用
三).使用二进制文件的好处
为什么要使用二进制文件。原因大概有三个:
第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存
第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。
第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。
四).二进制文件的储存方式
引用:00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34 ; .........S!EXb54
00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50 ; ABCDEFGHIGKLMNOP
这里列出的是在
这个文件一共有
下面我规定一下说明:我们认为,前
实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第