我有三个二进制文件(内存转储)。叫他们file1
,,file2
。file3
我正在尝试调试一些软件,并且正在切换一个开关。
file1
= 关掉file2
= 开启file3
= 关掉
我需要知道哪些字节在file1
和之间发生了变化file2
,然后又变回file1
了file3
.
之间有很多不相关的变化file1
,file2
所以diff
仅凭这一点不足以让我确定当我切换这个开关时发生了什么变化,我试图识别从file1
, 2
, 3
, ...变化的唯一熵字节。
我知道有xxd
, diff
, vimdiff
,等工具colordiff
。我只是不确定如何最好地使用它们来解决这个问题。
我是 Windows 用户,多年来我一直使用 Beyond Compare 进行文件比较,包括相互比较 3 个文件(一次 2 个)。
Beyond Compare 似乎也有 Linux 发行版,因此您可能想查看一下。
https://www.scootersoftware.com/download.php?zz=kb_linux_install
我知道 Windows 版本具有仅显示差异的选项,以及许多可能对您有所帮助的其他功能。我不记得他们是否有 3 种方式比较。
我不是他们的开发人员或销售人员,我只是非常喜欢这个软件。
file1
要了解在和file2
以及它们各自的值之间发生变化的字节,请使用cmp -l
:同样对于
file3
和file2
。诀窍是始终在同一方向进行调查(这里:关闭到打开),这就是为什么我把它放在file2
最后:现在您可以找到相同的更改:
输出将类似于(示例):
这意味着字节
1629
(十进制,编号以 开头1
)从152
(八进制)更改为(八112
进制)。笔记:
cmp -l
在我的 Ubuntu 中“列”了它的输出。这意味着它可能打印带有前导空格的行,第一列的宽度取决于输入大小。我想有些实现可能不会这样做。有几个问题:cmp
可能会生成比另一个更宽的第一列。在后来的背景下,comm
这是不可接受的。您可以通过管道将输出“去列化”awk '{print $1" "$2" "$3}'
。comm
可能会抱怨文件没有排序。在sort
保存sort -n
到changesAB
. 这可能会产生一些意想不到的顺序(例如,不同的字节23
将出现在不同的字节之后100453
),这可以通过将 to 的输出管道化comm
来解决sort -n
。changes*
文件可能很大。它们是中间的和临时的,因此过程替代可能是一个很好的方法。这是非 POSIX 的:来自的输出
comm
可以与另一个和另一个输出一起使用,cmp
以更好地过滤掉不相关的更改:但要记住:
cmp
在同一个方向(例如关闭到打开)。… | comm -12 - result1 > result1
是错的。文档:
cmp
comm
根据 Kamil 的回复,我用它来获得我需要的东西:
cmp -l 文件 1 文件 2 | awk '{print $1" "$2" "$3}' | 排序 > changes_12
cmp -l 文件 3 文件 2 | awk '{print $1" "$2" "$3}' | 排序 > changes_32
comm -12 changes_12 changes_32 > common_changes