浅析二进制文件与普通文件的区别
展开全部
近日,在写一个遍历查找目录文件内容功能时,在使用时功能很正常,确发现了些异常。读取文件时会将一些二进制文件读取出来,搜索目标字符串。本文将详细解析如何正确使用程序区分两种文件(基于c).
文中所指的二进制文件是指可执行文件,或者图片等非文本类型文件,即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 所以不向下做研究了。
文中所指的二进制文件是指可执行文件,或者图片等非文本类型文件,即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 所以不向下做研究了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询