⽂本⽂件和⼆进制⽂件的差异和区别
⼴义上的⼆进制⽂件包括⽂本⽂件,这⾥讨论的是狭义上的⼆进制⽂件与⽂本⽂件的⽐较:
1. 能存储的数据类型不同
⽂本⽂件只能存储char型字符变量。⼆进制⽂件可以存储char/int/short/long/float/……各种变量值。
2. 每条数据的长度
⽂本⽂件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。进制⽂件每条数据不固定。如short占两个字节,int占四个字节,float占8个字节……
3. 读取的软件不同
⽂本⽂件编辑器就可以读写。⽐如记事本、NotePad++、Vim等。⼆进制⽂件需要特别的解码器。⽐如bmp⽂件需要图像查看
器,rmvb需要播放器……
4. 操作系统对换⾏符(‘\n’)的处理不同(不重要)
⽂本⽂件,操作系统会对’\n’进⾏⼀些隐式变换,因此⽂本⽂件直接跨平台使⽤会出问题。
在Windows下,写⼊’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写⼊到⽂件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。
在Linux下,写⼊’\n’时,操作系统不做隐式变换。
⼆进制⽂件,操作系统不会对’\n’进⾏隐式变换,很多⼆进制⽂件(如电影、图⽚等)可以跨平台使⽤。
从存储⽅式来说,⽂件在磁盘上的存储⽅式都是⼆进制形式,所以,⽂本⽂件其实也应该算⼆进制⽂件。先从他们的区别来说,虽然都是⼆进制⽂件,但是⼆进制代表的意思不⼀样。打个⽐⽅,⼀个⼈,我们可以叫他的⼤名,可以叫他的⼩名,但其实都是代表这个⼈。⼆进制读写是将内存⾥⾯的数据直接读写⼊⽂本中,⽽⽂本呢,则是将数据先转换成了字符串,再写⼊到⽂本中。
要弄明⽩⼆者的区别,需要知道⽂件的读写过程。以读⽂件为例,
实际上是磁盘》》⽂件缓冲区》》应⽤程序内存空间这两个转化过程。我们说“⽂本⽂件和⼆进制⽂件没有区别”,实际上针对的是第⼀个过程;既然没有区别,那么打开⽅式不同,为何显⽰内容就不同呢?这个区别实际上是第⼆个过程造成的。
unicode码和ascii码区别⽂件实际上包括两部分,控制信息和内容信息。纯⽂本⽂件仅仅是没有控制格式信息罢了;
实际上也是⼀种特殊的⼆进制⽂件。所以,我们很难区分⼆者的不同,因为他们的概念上不是完全互斥的。我们说⽂本⽂件是特殊的⼆进制⽂件,是因为⽂本⽂件实际上的解释格式已经确定了:ASCII或者unicode编码。⽂本⽂件的⼀个缺点是,它的熵往往较低,也就是说,其实本可以⽤更⼩的存储空间记录这些信息。⽐如,⽂本⽂件中的⼀个数字65536,需要⽤5个字节来存储;但是⽤⼆进制格式,采⽤int存储,仅仅需要2个字节。⽽⼆进制⽂件elf和bmp等,都往往有⼀个head,告诉你⽂件信息和解释⽅式。
记事本⽀持⽂本⽂件⽽不⽀持⼆进制⽂件,所以如果你⽤记事本打开⽂本⽂件那么⼀切正常,如果打开的是⼆进制⽂件就会出现乱码。但也有不乱码的地⽅,你会注意到那些地⽅都是字符编码的,⽽对于int、double等类型所对应的值都是乱码的,这是由于记事本只能够识别字符类型,⽽⽆法识别其他类型。
1、⼆进制⽂件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。
2、⽂本⽂件是把数据的终端形式的⼆进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。
字符数据本⾝在内存中就经过了编码,所以⽆论是⼆进制还是⽂本形式都是⼀样的,⽽对于⾮字符数据来说,例如inti=10;如果⽤⼆进制来进⾏存储的话为1010,但是如果需要⽤⽂本形式来进⾏存储的话就必须进⾏格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)。
⼀、⽂本⽂件与⼆进制⽂件的定义
⼤家都知道计算机的存储在物理上是⼆进制的,所以⽂本⽂件与⼆进制⽂件的区别并不是物理上的,⽽是逻辑上的。这两者只是在编码层次上有差异。简单来说,⽂本⽂件是基于字符编码的⽂件,常见的编码有ASCII编码,UNICODE编码等等。⼆进制⽂件是基于值编码的⽂件,你可以根据具体应⽤,指定某个值是什么意思(这样⼀个过程,可以看作是⾃定义编码。
从上⾯可以看出⽂本⽂件基本上是定长编码的(也有⾮定长的编码如UTF-8)。⽽⼆进制⽂件可看成是变长编码的,因为是值编码嘛,多少个⽐特代表⼀个值,完全由你决定。⼤家可能对BMP⽂件⽐较熟悉,就拿它举例⼦吧,其头部是较为固定长度的⽂件头信息,前2字节⽤来记录⽂件为BMP格式,接下来的8个字节⽤来记录⽂件长度,再接下来的4字节⽤来记录bmp⽂件头的长度。
⼆、⽂本⽂件与⼆进制⽂件的存取
⽂本⼯具打开⼀个⽂件的过程是怎样的呢?拿记事本来说,它⾸先读取⽂件物理上所对应的⼆进制⽐
特流,然后按照你所选择的解码⽅式来解释这个流,然后将解释结果显⽰出来。⼀般来说,你选取的解码⽅式会是ASCII码形式(ASCII码的⼀个字符是8个⽐特),接下来,它8个⽐特8个⽐特地来解释这个⽂件流。例如对于这么⼀个⽂件流”01000000_01000001_01000010_01000011”(下划线”_”,为了增强可读性
⼿动添加的),第⼀个8⽐特”01000000”按ASCII码来解码的话,所对应的字符是字符”A”,同理其它3个8⽐特可分别解码为”BCD”,即这个⽂件流可解释成“ABCD”,然后记事本就将这个“ABCD”显⽰在屏幕上。
事实上,世界上任何东西要与其他东西通信会话,都存在⼀个既定的协议,既定的编码。⼈与⼈之间通过⽂字联络,汉字“妈”代表⽣你的那个⼈,这就是⼀种既定的编码。但注意到这样⼀种情况,汉字“妈”在⽇本⽂字⾥有可能是你⽣下的那个⼈,所以当⼀个中国⼈A与⽇本B之间⽤“妈”这个字进⾏交流,出现误解就很正常的。⽤记事本打开⼆进制⽂件与上⾯的情况类似。记事本⽆论打开什么⽂件都按既定的字符编码⼯作(如ASCII码),所以当他打开⼆进制⽂件时,出现乱码也是很必然的⼀件事情了,解码和译码不对应嘛。例如⽂件
流”00000000_00000000_00000000_00000001”可能在⼆进制⽂件中对应的是⼀个四字节的整数int 1,在记事本⾥解释就变成
了”NULL_NULL_NULL_SOH”这四个控制符。
⽂本⽂件的存储与其读取基本上是个逆过程。⽽⼆进制⽂件的存取显然与⽂本⽂件的存取差不多,只是编/解码⽅式不同⽽已。
三、⽂本⽂件与⼆进制⽂件的优缺点
因为⽂本⽂件与⼆进制⽂件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个本编码的书来看看就⽐较清楚了。⼀般认为,⽂本⽂件编码基于字符定长,译码容易些;⼆进制⽂件编码是变长的,所以它灵活,存储利⽤率要⾼些,译码难⼀些(不同的⼆进制⽂件格式,有不同的译码⽅式)。关于空间利⽤率,想想看,⼆进制⽂件甚⾄可以⽤⼀个⽐特来代表⼀个意思(位操作),⽽⽂本⽂件任何⼀个意思⾄少是⼀个字符。
在windows下,⽂本⽂件不⼀定是⼀ASCII来存贮的,因为ASCII码只能表⽰128的标识,你打开⼀个txt⽂档,然后另存为,有个选项是编码,可以选择存贮格式,⼀般来说UTF-8编码格式兼容性要好⼀些.⽽⼆进制⽤的计算机原始语⾔,不存贮兼容性. 很多书上还认为,⽂本⽂件的可读性要好些,存储要花费转换时间(读写要编译码),⽽⼆进制⽂件可读性差,存储不存在转换时间(读写不要编解码,直接写值).这⾥的可读性是从软件使⽤者⾓度来说的,因为我们⽤通⽤的记事本⼯具就⼏乎可以浏览所有⽂本⽂件,所以说⽂本⽂件可读性好;⽽读写⼀个具体的⼆进制⽂件需要⼀个具体的⽂件解码器,所
以说⼆进制⽂件可读性差,⽐如读BMP⽂件,必须⽤读图软件。
⽽这⾥的存储转换时间应该是从编程的⾓度来说的,因为有些操作系统如windows需要对回车换⾏符进⾏转换(将”\n”,换成”\r\n”,所以⽂件读写时,操作系统需要⼀个⼀个字符的检查当前字符是不是”\n”或”\r\n”).这个在存储转换在Linux操作系统中并不需要,当然,当在两个不同的操作系统上共享⽂件时,这种存储转换⼜可能出来。
⽂本⽂件是⼀种计算机⽂件,它是⼀种典型的顺序⽂件,其⽂件的逻辑结构⼜属于流式⽂件。
特别的是,⽂本⽂件是指以ASCII码⽅式(也称⽂本⽅式)存储的⽂件,更确切地说,英⽂、数字等字符存储的是ASCII码,⽽汉字存储的是机内码。⽂本⽂件中除了存储⽂件有效字符信息(包括能⽤ASCII码字符表⽰的回车、换⾏等信息)外,不能存储其他任何信息。
⽂本⽂件是⼀种由若⼲⾏字符构成的计算机⽂件。⽂本⽂件存在于计算机⽂件系统中。通常,通过在⽂本⽂件最后⼀⾏后放置⽂件结束标志来指明⽂件的结束。⽂本⽂件是指⼀种容器,⽽纯⽂本是指⼀种内容。⽂本⽂件可以包含纯⽂本。⼀般来说,计算机⽂件可以分为两类:⽂本⽂件和⼆进制⽂件。
只含有ASCII字符的⽂本⽂件可以在Unix、Macintosh、Microsoft Windows、DOS和其它操作系统之间⾃由交互,⽽其它格式的⽂件是很难做到这⼀点的。但是,在这些操作系统中,换⾏符并不相同,处理⾮ASCII字符的⽅式也不⼀致。
.txt是包含极少格式信息的⽂字⽂件的扩展名。.txt格式并没有明确的定义,它通常是指那些能够被系统终端或者简单的⽂本编辑器接受的格式。任何能读取⽂字的程序都能读取带有.txt扩展名的⽂件,因此,通常认为这种⽂件是通⽤的、跨平台的。
在英⽂⽂本⽂件中,ASCII字符集是最为常见的格式,⽽且在许多场合,它也是默认的格式。对于带重⾳符号的和其它的⾮ASCII字符,必须选择⼀种字符编码。在很多系统中,字符编码是由计算机的区域设置决定的。常见的字符编码包括⽀持许多欧洲语⾔的ISO 8859-1。
由于许多编码只能表达有限的字符,通常它们只能⽤于表达⼏种语⾔。Unicode制定了⼀种试图能够表达所有已知语⾔的标准,Unicode字符集⾮常⼤,它囊括了⼤多数已知的字符集。Unicode有多种字符编码,其中最常见的是UTF-8,这种编码能够向后兼容ASCII,相同内容的的ASCII⽂本⽂件和UTF-8⽂本⽂件完全⼀致。
微软的MS-DOS和Windows采⽤了相同的⽂本⽂件格式,它们都使⽤CR和LF两个字符作为换⾏符,这两个字符对应的ASCII码分别为13和10。通常,最后⼀⾏⽂本并不以换⾏符(CR-LF标志)结尾,包括记事本在内的很多⽂本编辑器也不在⽂件的最后添加换⾏符。
⼤多数Windows⽂本⽂件使⽤ANSI、OEM或者Unicode编码。Windows所指的ANSI编码通常是1字节的ISO-8859编码,不过对于像中⽂、⽇⽂、朝鲜⽂这样的环境,需要使⽤2字节字符集。在过渡⾄Uni
code前,Windows⼀直⽤ANSI作为系统默认的编码。⽽OEM编码,也是通常所说的MS-DOS代码页,是IBM为早期IBM个⼈电脑的⽂本模式显⽰系统定义的。在全屏的MS-DOS程序中同时使⽤了图形的和按⾏绘制的字符。新版本的Windows可以使⽤UTF-16LE和UTF-8之类的Unicode编码。
由于结构简单,⽂本⽂件被⼴泛⽤于记录信息。它能够避免其它⽂件格式遇到的⼀些问题。此外,当⽂本⽂件中的部分信息出现错误时,往往能够⽐较容易的从错误中恢复出来,并继续处理其余的内容。⽂本⽂件的⼀个缺点是,它的熵往往较低,也就是说,可以⽤较⼩的存储空间记录这些信息。
⽂本⽂件基本上是定长编码的(也有⾮定长的编码如UTF-8),基于字符,每个字符在具体编码中是固定的,ASCII码是8个⽐特的编
码,UNICODE⼀般占16个⽐特。⽽⼆进制⽂件可看成是变长编码的,因为是值编码,多少个⽐特代表⼀个值,完全由⾃⼰决定。
⼴义的⼆进制⽂件即指⽂件,由⽂件在外部设备的存放形式为⼆进制⽽得名。狭义的⼆进制⽂件即除⽂本⽂件以外的⽂件。
每个字符由⼀个或多个字节组成,每个字节都是⽤的-128—127之间的部分数值来表⽰的,也就是说,-128——127之间还有⼀些数据没有对应任何字符的任何字节。如果⼀个⽂件中的每个字节的内容
都是可以表⽰成字符的数据,我们就可以称这个⽂件为⽂本⽂件。⽂本⽂件只是⼆进制⽂件中的⼀种特例,为了与⽂本⽂件相区别,⼈们⼜把除了⽂本⽂件以外的⽂件称为⼆进制⽂件,由于很难严格区分⽂本⽂件和⼆进制⽂件的概念,所以我们可以简单地认为,如果⼀个⽂件专门⽤于存储⽂本字符的数据,没有包含字符以外的其他数据,我们就称之为⽂本⽂件,除此之外的⽂件就是⼆进制⽂件。
为什么要使⽤⼆进制⽂件。原因⼤概有三个:
第⼀是⼆进制⽂件⽐较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,⼆进制更节省空间;第⼆个原因是,内存中参加计算的数据都是⽤⼆进制⽆格式储存起来的,因此,使⽤⼆进制储存到⽂件就更快捷。如果储存为⽂本⽂件,则需要⼀个转换的过程。在数据量很⼤的时候,两者就会有明显的速度差别了。第三,就是⼀些⽐较精确的数据,使⽤⼆进制储存不会造成有效位的丢失。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论