如何使用“cmp”来比较两个二进制文件,并find它们不同的所有字节偏移量?

我会喜欢一些Bash脚本循环的帮助,它将显示两个二进制文件间的所有区别,使用

cmp file1 file2

它只显示我想使用cmp的第一个改变,因为它给出了一个行号,每一个改变的位置,但如果你认为有一个更好的命令,我打开它:)谢谢

为什么有一个“预期的整数expression式”?

在计算文本文件中的列数之后删除

在bash中使用variablescp

用shell脚本(bash)find我系统的ip地址,

使用sed和pstree来显示正在使用的terminal的types

我认为cmp -l file1 file2可能会做你想做的。 从手册:

-l --verbose Output byte numbers and values of all differing bytes.

输出是偏移量的表,file1中的字节值和file2中所有不同字节的值。 它看起来像这样:

4531 66 63 4532 63 65 4533 64 67 4580 72 40 4581 40 55 [...]

所以第一个区别在偏移量4531,其中file1的十进制字节值是66,file2是63。

我找到的更有效的解决方法是使用od将二进制文件转换为某种形式的文本。

然后任何diff味道很好。

适用于字节添加/删除方法

diff <(od -An -tx1 -w1 -v file1) <(od -An -tx1 -w1 -v file2)

生成一个删除字节64的单个测试用例:

for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1 for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2

输出

64d63 < 40

如果你还想看到字符的ASCII版本:

bdiff() ( f() ( od -An -tx1c -w1 -v "$1" | paste -d '' - - ) diff <(f "$1") <(f "$2") ) bdiff file1 file2

输出

64d63 < 40 @

在Ubuntu 16.04上测试

我更喜欢od xxd因为:

是POSIX , xxd不是(自带Vim)

有-An没有awk删除地址列。

命令解释:

-An删除地址栏。 这一点很重要,否则所有的行在添加/删除字节后都会有所不同。

-w1每行放一个字节,以便diff可以消耗它。 每行一个字节是至关重要的,否则删除后的每一行都会变得不同相并且不同。 不幸的是,这不是POSIX,而是存在于GNU中。

-tx1是你想要的表示,只要你保持每行1个字节,就改变为任何可能的值。

-v防止可能干扰diff的星号重复缩写*

paste -d '' - -每两行加入。 我们需要它,因为十六进制和ASCII进入单独的相邻行。 采取: 连接其他每一行与下一个

我们使用括号()来定义bdiff而不是{}来限制内部函数f的范围,另请参阅: 如何在bash中的另一个函数内定义一个函数

也可以看看:

https://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux

https://unix.stackexchange.com/questions/59849/diff-binary-files-of-different-sizes

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...