如何比较二进制文件以检查它们是否相同?

saw*_*awa 161 binary diff compare file

什么是最简单的方法(在Ubuntu Linux上使用图形工具或命令行)来知道两个二进制文件是否相同(时间戳除外)?我不需要实际提取差异.我只需要知道它们是否相同.

Joe*_*Joe 161

标准unix diff将显示文件是否相同:

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ
Run Code Online (Sandbox Code Playgroud)

如果命令没有输出,则表示文件没有差异.

  • 这是正确的 - 没有输出意味着它们是相同的 (22认同)
  • 如果我没有得到`diff`的输出,那意味着文件是一样的? (19认同)
  • 差异似乎与*非常大的*文件有问题.比较两个13G文件时,我得到了一个"差异:内存耗尽". (4认同)
  • 您可以使用以下选项报告相同的文件:`diff -s 1.bin 2.bin`或`diff --report-identical-files 1.bin 2.bin`这表示`Files 1.bin和2.bin是相同的` (4认同)
  • 我有两个可执行文件,我知道它们是不同的,因为我编译并运行了它们,但这里给出的 diff 和 cmp 的所有选项都判断它们相同。为什么?!!! (2认同)

小智 94

使用cmp命令.如果它们是二进制相等的,它将干净地退出,或者它将打印出第一个差异发生的位置并退出.

  • 对于用例,OP描述了恕我直言`cmp`比`diff`更有效.所以我更喜欢这个. (9认同)
  • 我有一个运行的shell脚本:`cmp $ 1 $ 2 && echo"相同"|| 回声"不同"` (4认同)
  • 找到第一个差异并显示它或贯穿文件末尾时,cmp会停止吗? (2认同)

sha*_*.lo 82

我发现Visual Binary Diff是我想要的,可用于:

  • Ubuntu的: __CODE__
  • Arch Linux: __CODE__
  • Mac OS X:__CODE__通过MacPorts.
  • Mac OS X:__CODE__通过Homebrew

  • 很好...我/想/我只想知道文件是否不同;但是能够很容易地看到确切的差异更有用。当我到达文件末尾时,它往往会出现段错误,但没关系,它仍然有效。 (3认同)
  • 已经说过几次了,但这是一个很棒的小程序!(仅供参考自制软件) (3认同)
  • 这应该是公认的答案,因为它比规范 diff 命令的乏味和无用的输出要优越得多。 (3认同)
  • 这是二进制差异的最佳工具。 (2认同)

Sco*_*ell 16

使用sha1生成校验和:

sha1 [FILENAME1]
sha1 [FILENAME2]
Run Code Online (Sandbox Code Playgroud)

  • 如果你只有一个文件的校验和,这将是有用的,但如果你在磁盘上有这两个文件,这是不必要的.`diff`和`cmp`都会告诉你它们是否有所不同而没有任何额外的努力. (3认同)
  • 在NetBSD上为sha1,在Linux上为sha1sum (2认同)
  • 尽管存在差异,但有两个文件将返回相同的结果:https://shattered.io/ (2认同)
  • SHA1已经发生了一次公开冲突(https://shattered.io/),也可能有一些非公开冲突。一次冲突可用于生成无数冲突文件,请改用SHA2进行哈希处理。 (2认同)

sim*_*tek 11

我最终使用hexdump将二进制文件转换为十六进制表示,然后在meld/kompare /任何其他diff工具中打开它们.与你不同,我是在文件的差异之后.

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt
Run Code Online (Sandbox Code Playgroud)

  • 如果您想比较并准确查看插入或删除了哪些字节,请使用 `hexdump -v -e '/1 "%02x\n"'`。 (2认同)

Sta*_*uff 9

尝试 diff -s

简短的回答:diff-s开关运行。

长答案:请继续阅读下文。


这是一个例子。让我们首先创建两个具有随机二进制内容的文件:

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s

                                                                                  
$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s
Run Code Online (Sandbox Code Playgroud)

现在让我们复制第一个文件:

$ cp test1.bin copyoftest1.bin
Run Code Online (Sandbox Code Playgroud)

现在 test1.bin 和 test2.bin 应该不同:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ
Run Code Online (Sandbox Code Playgroud)

...并且 test1.bin 和 copyoftest1.bin 应该相同:

$ diff test1.bin copyoftest1.bin
Run Code Online (Sandbox Code Playgroud)

可是等等!为什么没有输出?!?

答案是:这是设计使然。相同的文件没有输出。

但有不同的错误代码:

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

现在幸运的是,您不必每次都检查错误代码,因为您可以使用-s(或--report-identical-files) 开关来使 diff 更详细:

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
Run Code Online (Sandbox Code Playgroud)


use*_*314 6

使用cmp命令.有关更多信息,请参阅二进制文件和强制文本比较.

cmp -b file1 file2
Run Code Online (Sandbox Code Playgroud)


DKr*_*oot 6

具有以下选项的 Diff 将进行二进制比较,以检查文件是否完全不同,并输出文件是否相同:

diff -qs {file1} {file2}
Run Code Online (Sandbox Code Playgroud)

如果要比较不同目录中具有相同名称的两个文件,可以使用以下形式:

diff -qs {file1} --to-file={dir2}
Run Code Online (Sandbox Code Playgroud)

OS X 埃尔卡皮坦


Rik*_*kki 5

__CODE__

__CODE__

看看它们是否相同:-)

  • 你能解释一下你的票数吗?SHA1有4个upvotes,如果OP认为这两个文件可能相同或相似,碰撞的可能性很小,不值得投票MD5,但不能投票SHA1,因为你听说你应该哈希你的使用SHA1而不是MD5的密码(这是一个不同的问题). (5认同)
  • 我贬低了,因为你发布了一个早期(坏)解决方案的一个小变体,它应该是一个评论. (5认同)
  • 不确定原因,但纯cmp将比计算文件的任何哈希函数和比较它们更有效(至少只有2个文件) (2认同)