用于三路二进制(十六进制)文件比较的工具?

5
我有一组二进制配置文件,每个文件都有三个版本-原始版本和两个不同修改的版本。我需要能够同时查看两个版本以及原始版本之间的差异。
我需要一个用于二进制文件的三向比较工具。通过非常费力的谷歌搜索,我最终找到了一张截图,显示了一个正好符合我需求的应用程序,但不幸的是,包含该图像的论坛帖子没有提到他们正在使用哪个应用程序。

http://www.xboxhacker.org/index.php?topic=15032.0

有没有人能指引我使用一个(Windows)应用程序,提供三个二进制文件的二进制安全(十六进制)比较?


顺便说一句,我真的在寻找一个GUI工具。如果有人能告诉我那个论坛帖子中最后一张截图中那个工具的名称,我会很高兴的。 - Brian Lacy
5个回答

10

Vim内置了一个比较任意数量文件的差异工具,也可以在Windows上运行。您可以在http://vim.org找到它。

Windows上的vim标准安装包含xxd,它允许您将二进制文件视为文本:

例如,如果您尝试:

xxd xxd.exe

你将获得:

0000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000  MZ..............
0000010: b800 0000 0000 0000 4000 0000 0000 0000  ........@.......
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 d800 0000  ................
0000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468  ........!..L.!Th
0000050: 6973 2070 726f 6772 616d 2063 616e 6e6f  is program canno
0000060: 7420 6265 2072 756e 2069 6e20 444f 5320  t be run in DOS 
0000070: 6d6f 6465 2e0d 0d0a 2400 0000 0000 0000  mode....$.......
0000080: 6ba7 bec3 2fc6 d090 2fc6 d090 2fc6 d090  k.../.../.../...

所以你可以使用xxd将二进制文件转换成文本文件:

xxd orig > orig.txt
xxd mod1 > mod1.txt 
xxd mod2 > mod2.txt

然后在diff模式下运行vim:

vim -d orig mod1 mod2

这将会让你得到以下类似的结果:

3-way vimdiff的示例

(这个截图来自这里,仅是VIM中3-way diff的插图)

所有这些工具都可以在Windows上使用,因此它们应该可以解决你的问题。

编辑:

合并xxd的结果后,你可以使用xxd -r将十六进制转换为二进制文件:

xxd -r merged_xxd_file merged_binary_file

你可以在xxd的手册页面中查看更多细节和选项。


1
谢谢,但我正在寻找一个GUI工具,比如我在引用的那个论坛帖子末尾的截图中看到的那种。我还需要能够合并。 - Brian Lacy
1
vim有一个图形用户界面。在我写vim的任何地方,只需使用gvimvim的差异模式可以非常高效地进行合并。 - Nathan Fellman
我不能通过将二进制文件转储到文本文件中并合并它们来合并二进制文件。 ;) 我需要能够合并实际的二进制文件。但是谢谢,我不知道vim有Windows GUI。 - Brian Lacy
1
@Brian:是的,你可以使用xxd -r。我已经更新了答案并提供了详细信息。 - Nathan Fellman

2
这段话的意思是:“这个截图来自于Araxis Merge。他们的专业版(270美元)支持三方比较。”

这不支持二进制文件的三路合并。来自链接:“除了两个文件的比较外,Merge的专业版还允许您比较(对于文本文件,合并)三个文件”。 - Nathan Fellman
我在你的帖子中没有看到OP的评论。好吧,就是那个图片上的工具,它确实可以进行三路二进制比较。我认为二进制合并支持相当罕见,因为很容易引入损坏。这肯定是我们从未考虑过在Beyond Compare中使用的原因。 - Zoë Peterson
@Craig: "我们从未考虑在Beyond Compare中使用for语句"。你在Beyond Compare上工作吗?太棒了!非常出色! - Nathan Fellman
Craig:我已经下载了Araxis Merge的评估版,看起来你是正确的——Araxis Merge Pro确实支持二进制文件的三方合并!非常惊人。它也非常昂贵(就像你说的那样),而且显然不是非常稳定,因为在我打开第二个二进制文件后它就崩溃了。;)但我将投资于商业比较产品,我宁愿选择具有我需要的所有功能的产品。 - Brian Lacy
@Brian:我们并不是拒绝做某件事,只是将其优先级降低了。十六进制和文本比较的代码和数据结构非常不同,实现十六进制合并需要大量的工作。它必须像任何其他功能一样进行安排、编写和测试。这不是我们已经让它工作但出于恶意而禁用了。这也不是一个很常见的请求,我们必须处理客户想要的东西。BC支持的功能有很多Araxis不支持,比如比较Excel文件或实时注册表,以及忽略重命名的标识符。 - Zoë Peterson
显示剩余2条评论

2

你可以看一下我开发的工具ECMerge,它可以进行二进制文件(HEX + ASCII)的2和3向差异比较。该工具没有合并功能,但是你可以轻松地在修改区域之间移动,并压缩长区域(长插入、更改或未更改的区域)。


0

1
我之前已经调查过这个问题。BC有文本三向比较二进制比较——它们是独立的模式,不能同时使用。我无法想象为什么他们会做出如此荒谬的区分,但事实就是这样。 :( - Brian Lacy
@Brian:你可以使用xxd将二进制文件转换为文本,然后使用BC进行三路比较,最后使用xxd -r将合并后的文本转换回二进制文件。 - Nathan Fellman
1
@Brian:文本比较和二进制比较之间的算法、数据结构和编辑器界面完全不同,这不是任意限制,而是优先事项和几个月开发的问题,因为这不是常见需求。 - Zoë Peterson

0

最近我接触到了p4merge,它似乎也支持二进制文件。

它需要三个文件作为输入:原始文件和两个派生文件。它将它们并排显示,并显示第四个窗口,其中包含合并后的文件,具有编辑功能和冲突解决能力。

我刚刚使用它来合并一个大型代码库的两个分支,非常方便。

p4merge example

现在,我还没有用它来合并二进制文件,但它支持比较图片,所以如果不支持二进制文件,我会感到惊讶。


它无法区分二进制文件。这并不奇怪,因为许多版本控制系统至少支持直接比较图像,因为在进行网站、出版或 UI 时,图像是常见的内容类型。 - Alexey Biryukov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接