微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用“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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐