⑴ 如何实现二进制文件对比
提供几个方法供参考:
命令行下的diff/cmp命令,可以得出这两个binary是否完全一样:
diff file1 file2 cmp -b file1 file2
命令行下的hexmp,得到hex文本后,再用diff比较两个文件的hex文本:
hexmp file1.bin > file1.hex
hexmp file2.bin > file2.hex
diff file1.hex file2.hex
计算这两个文件的MD5或SHA1,得到的hash值相同则是同一个文件
⑵ 计算机编程中的diff是什么意思
diff 命令比较文本文件。它能比较单个文件或者目录内容。
注:
diff 命令只有当输入为文本文件时才有效。
如果指定了 Directory1 和 Directory2 参数,diff 命令比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。 当 diff 命令运行于常规文件时,且当目录比较期间比较不同的文本文件时,diff 命令显示文件中哪些行必须更改以保持它们一致。如果 File1 和 File2 参数都不是目录,其中之一可能给定负号“-”,以采用标准输入。如果 File1 参数是目录,则使用目录中与 File2 参数指定的文件名一致的那个文件。
⑶ 浅析二进制文件与普通文件的区别
近日,在写一个遍历查找目录文件内容功能时,在使用时功能很正常,确发现了些异常。读取文件时会将一些二进制文件读取出来,搜索目标字符串。本文将详细解析如何正确使用程序区分两种文件(基于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 所以不向下做研究了。
⑷ diff命令如何排除二进制文件,不比较
diff这个命令本身就是做文本文件比较的, 不判断文件类型;
如果需要排除某些类型的文件(例如: 二进制文件), 应该结合使用其他用来判断文件类型的命令(例如:file)或者编写shell脚本