文中所指的二进制文件是指可执行文件,或者图片等非文本类型文件,即Binary文件。
首先,为了文件的简单,我们手工生成两个文件,一个普通文件,一个二进制可执行文件
生成普通文件
生成可执行文件a.out
使用grep 查找hello时,两个文件输出为
grep是碰到可执行文件时会输出Binary file
文本文件是一种计算机文件,它是一种典型的顺序文件,其埋禅文件的逻辑结构又属于流式文件。(来源百度百科)
本文定义为:文本文件是一种顺序存储了unicode编码,或者其他编码字符的文件。因为不仅可以存英文还可以存放一些表情及换行等其他字符。
将依次遍历文档,然后与所有的可能的编码中的字符进行查找比较,如果所有字符都符合在这些编码字符列表中,则当前文档即为一个文本文档。
不过这种方法的效率堪忧,有没有一种更简单的方法呢。当然有!
当我们使用十六进制的方式打开两个文件,就会发现不同了。同时对比了一张图片的十六进制
图片
在文本文件的十六进制备液虚编码同时将 unicode符号也在文本中展示出来了。也可以从文本文件的定义可以得出,非ascii不能作为检测二进制的方法。
但是通过对比三个文件的十六进制编码会发仿燃现,可执行文件与图片中包含 了很多00,即空字符,而文本文件中是不存在的。
所以初步结论是不含有空字符的文件即为二进制文件.
但是我们总不能从文件头到尾去判断吧,所以我们查看grep与diff源码会发现一段宏
所以我们取一段数据长度判断,如果是包含了空字符就是非文本类型文件,比如取1024个字节。因为二进制文件一般会有一个文件头,而文件头的数据长度大约128个字节。取1024字节是尽可能的避免头中数据写满。
当然以上方法只针对于utf-8, asccii ,如果是utf-16或者 utf-32 在数据中也同样会产生空字符
使用grep中同样会将其识别为binary file 所以不向下做研究了。
二进制文槐粗件与文本文件在定义、存取方式、优缺点上有一些区别:一、定义的区别
文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。
二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。
二、存储方式的区别
文本工具打开一个文件,首先读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。
一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。
记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应。
文本文件的存储与其读取基本上液山是个逆过程。而二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。
三、优缺点的区别
因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个找本编码的书来看看就比较清楚了。
一般认为,文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。
关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位 *** 作),而文本闹明中文件任何一个意思至少是一个字符.
在windows下,文本文件不一定是以ASCII来存贮的,因为ASCII码只能表示128的标识,你打开一个txt文档,然后另存为,有个选项是编码,可以选择存贮格式,一般来说UTF-8编码格式兼容性要好一些.而二进制用的计算机原始语言,不存在兼容性。
参考资料:
百度百科
--
文件文本
百度百科
--
二进制文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)