浅析二进制文件与普通文件的区别

 我来答
长青数码
2022-06-23 · TA获得超过2599个赞
知道小有建树答主
回答量:552
采纳率:100%
帮助的人:78.1万
展开全部
近日,在写一个遍历查找目录文件内容功能时,在使用时功能很正常,确发现了些异常。读取文件时会将一些二进制文件读取出来,搜索目标字符串。本文将详细解析如何正确使用程序区分两种文件(基于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 所以不向下做研究了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式