二进制文件和文本文件

  通常,我们喜欢把文件分为二进制文件(binary file)和文本文件(text file)两类。但事实上,所有文件在计算机上都是以二进制方式进行存储的,因此二者并无本质上的区别,它们的区别仅在于对文件内容的解释方式上。


1.概述

  广义上来说,二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名,显然,这个层面下,文本文件属于二进制文件的一种;那么,本文所要讲的,是狭义上的二进制文件和文本文件。
  如前所述,所有的文件都是由一连串的0、1组成,故而在物理上,二进制文件和文本文件无差异,它们的差异是逻辑上的。当我们打开文件时,需要对底层的二进制码作出相应的解释:对于文本文件,应用程序(一般为文本编辑器)会将二进制码解释为文本字符;而对于二进制文件,应用程序(很多,如图像查看器、视频播放器等)会将二进制码解释为其它内容。对于二进制文件和文本文件的区分,以上表述似乎还不能很让人满意,下面我们采用Q&A的形式,细致地剖析这个问题:

  • — Q:简单直接地,什么是文本文件,什么又是二进制文件?
  • — A:文本文件,就是根据字符编码规则解码后,能够全部解码为文本字符的;二进制文件,就是除了文本文件外的所有其它文件,也即,文件底层的二进制码不能根据字符编码规则全部解码为文本字符;换言之,文本文件是根据字符编码规则写入的,而二进制文件是根据其它规则编码写入的;
  • — Q:拿到一个文件,应用程序怎么知道根据什么规则去解码?
  • — A:不同类型的文件有不同的解码规则,因而就有不同的解码器,只要我们选对了解码器(应用程序),解码器自然会根据一套固定的规则去对文件进行解码,文本文件如此,二进制文件(如bmp、rmvb、png)亦如此;
  • — Q:如何选择正确的解码器?
  • — A:最简单的,根据文件扩展名去选择解码器即可,比如,对于.txt文件,这是文本文件,选用记事本或者notepad++均可,对于.bmp文件,这是图像文件(或者说是二进制文件),选用图像查看器即可;不过,文件扩展名是可以随意更改的,因此一个更可靠的方法是根据文件头去选择解码器:一般而言,文件都有文件头,处在文件的开头部分,其中包含着文件的格式信息,比如有个文件的开头两个字节是 0x42 0x4D,对应的ASCII字符是BM,因此我们知道这是一个BMP文件,故而选择图像查看器即可;
  • — Q:如果选错了解码器,文件能打开吗?
  • — A:选错了解码器,由于编解码规则不一致,解释出来的内容自然就成了所谓的“乱码”,比如,用记事本去打开.bmp文件,就会看到一堆乱码,当然也有不是乱码的地方,你会注意到那些地方都显示为字符,因此能被记事本用字符解码规则解释出来;

  相信上述几个问题已经解决了绝大多数人的疑惑,接下来我们分别从文件读写的角度切入,进一步区分二进制文件和文本文件。

2.写(write)

  1. 能存储的数据类型不同
    • 文本文件只能存储char型字符变量;
    • 二进制文件可以存储char/int/short/long/float/……各种变量值;
  2. 每条数据的长度不同
    • 文本文件每条数据通常是固定长度的,以ASCII字符为例,每条数据(每个字符)都是1个字节(也有非定长的编码如UTF-8);
    • 二进制文件每条数据不固定,如short占两个字节,int占四个字节,float占8个字节;
  3. 对换行符的处理不同(详见文本文件换行符
    • 文本文件的换行符,在不同的操作系统中有所区别:对于DOS\Windows操作系统,当我们向文本文件中写入换行符“\n”时,会自动转换为“\r\n”再写入,当我们从文本文件中读取时,又会自动将“\r\n”再转换为“\n”输出;对于Unix\类Unix操作系统,写入读取均为“\n”,没有转换过程;
    • 二进制文件的换行符,不存在上述问题,写入的是什么就是什么;

3.读(read)

  1. 读取的应用程序不同
    • 文本文件,选用文本编辑器,如记事本、notepad++、vim等;
    • 二进制文件,需要特别的解码器,如bmp文件需要图像查看器,rmvb文件需要视频播放器;

4.二者的比较

  1. 文本文件的优点
    • 一般认为,文本文件编码基于字符定长,译码容易;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式);
    • 由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。
  2. 二进制文件的优点
    • 二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间。比如储存数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40);
    • 内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。(就像上面的3.1415927需要转换一番);
    • 一些比较精确的数据,使用二进制储存不会造成有效位的丢失。

参考文献

[1] https://www.zhihu.com/question/19971994
[2] https://zhuanlan.zhihu.com/p/20693043
[3] http://blog.csdn.net/sxhelijian/article/details/29594687
[4] http://www.cnblogs.com/zhourong2015/p/5094688.html
[5] https://baike.baidu.com/item/BMP/35116?fr=aladdin
[6] http://www.cnblogs.com/flying-roc/articles/1798817.html
[7] http://blog.csdn.net/jason_cuijiahui/article/details/73866060
[8] http://www.cnblogs.com/macliu/p/6340131.html
[9] http://www.cjjjs.com/paper/xmkf/624201593922582.aspx
[10] https://www.dplord.com/2016/03/14/diffenerce-between-binary-file-and-text-file/
[11] http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html
[12] http://blog.csdn.net/universe_hao/article/details/52779699
[13] http://blog.csdn.net/abcdyzhang/article/details/56331492
以上为本文的全部参考文献,对原作者表示感谢。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值