【问题标题】:How to compare binary files to check if they are the same?如何比较二进制文件以检查它们是否相同?
【发布时间】:2012-08-20 13:11:03
【问题描述】:

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

【问题讨论】:

  • 一个问题要求显示它们如何不同:superuser.com/questions/125376/…
  • cmp 的手册页明确表示它会进行逐字节比较,因此这是我对 2 个二进制文件的默认设置。 diff 是逐行的,会给你相同的是/否答案,但当然不会向标准输出流提供相同的转储。如果这些行很长,因为它们可能不是文本文件,那么我更喜欢cmpdiff 的优点是您可以指定目录比较,-r 用于递归,从而在一个命令中比较多个文件。

标签: file binary compare diff


【解决方案1】:

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

[me@host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

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

【讨论】:

  • diff 似乎对 非常大 文件有问题。比较两个 13G 文件时,我得到了 diff: memory exhausted
  • 有趣的输出。 diff 告诉你他们是“二进制”文件。因为所有文件都可以被认为是二进制文件,所以这是一个奇怪的断言。
  • 您可以使用以下选项报告相同的文件:diff -s 1.bin 2.bindiff --report-identical-files 1.bin 2.bin 这显示Files 1.bin and 2.bin are identical
  • 不,它会说它们“不同”,所以它们不一样
  • 我有两个可执行文件,我知道它们是不同的,因为我编译并运行了它们,但是这里给出的所有 diff 和 cmp 选项都判断它们是相同的。为什么? !!!
【解决方案2】:

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

【讨论】:

  • 对于 OP 描述的用例,恕我直言 cmpdiff 更有效。所以我更喜欢这个。
  • 我有一个运行的 shell 脚本:cmp $1 $2 && echo "identical" || echo "different"
  • cmp 在找到第一个差异时是否停止并显示它或遍历文件末尾?
  • cmp 具有“静默”模式:-s, --quiet, --silent - suppress all normal output。我还没有测试,但我认为它会在第一个差异处停止。
  • 我现在检查了cmp (GNU diffutils) 3.7。正如答案中已经说明的那样,cmp 停在第一个差异处并像这样指定它:file1 file2 differ: char 14, line 1
【解决方案3】:

我发现 Visual Binary Diff 是我正在寻找的,可在:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X 通过MacPorts

    port install vbindiff
    
  • 通过 Homebrew 的 Mac OS X:

    brew install vbindiff
    

【讨论】:

  • 很好...我/thought/我只想知道文件是否不同;但是能够轻松地看到确切的差异会更有用。当我到达文件末尾时,它往往会出现段错误,但没关系,它仍然有效。
  • 已经说了好几遍了,但这是一个很棒的小程序! (仅供参考,自制软件)
  • 这应该是公认的答案,因为它比规范 diff 命令的平淡无益的输出要好得多。
  • 这是二进制差异的最佳工具。
【解决方案4】:

使用sha1生成校验和:

sha1 [FILENAME1]
sha1 [FILENAME2]

【讨论】:

  • 如果您只有其中一个文件的校验和,这将很有用,但如果您在磁盘上有两个文件,则这是不必要的。 diffcmp 都会告诉你它们是否不同,而无需任何额外的努力。
  • 不是sha1sum而不是sha1吗?
  • NetBSD 上的 sha1,Linux 上的 sha1sum
  • 有两个文件尽管不同但会返回相同的结果:shattered.io
  • SHA1 已经有一个公共冲突 (shattered.io) 并且可能还有一些非公共冲突。一次碰撞可以生成无数个碰撞文件 请改用 SHA2 进行散列。
【解决方案5】:

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

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

meld tmp/hex1.txt tmp/hex2.txt

【讨论】:

  • 如果您想区分并查看插​​入或删除了哪些字节,请使用hexdump -v -e '/1 "%02x\n"'
  • Meld 也适用于未先转换为十六进制的二进制文件。它显示不在字符集中的内容的十六进制值,否则为普通字符,这对于还包含一些 ascii 文本的二进制文件很有用。许多人都这样做,至少从一个魔术字符串开始。
【解决方案6】:

您可以使用MD5哈希函数来检查两个文件是否相同,这样您就不会在低层次上看到差异,而是比较两个文件的快速方法。

md5 <filename1>
md5 <filename2>

如果两个 MD5 哈希(命令输出)相同,那么,两个文件没有区别。

【讨论】:

  • 你能解释一下你的反对票吗? SHA1 有 4 个赞成票,如果 OP 认为这两个文件有可能相同或相似,那么发生冲突的可能性很小,不值得反对 MD5,但赞成 SHA1,除非你听说你应该散列你的使用 SHA1 而不是 MD5 的密码(这是一个不同的问题)。
  • 不确定原因,但纯 cmp 比计算文件的任何哈希函数并比较它们(至少对于 2 个文件)更有效
  • 如果这两个文件很大并且在同一个磁盘(不是 ssd)上,md5 或 sha* 变体可能会更快,因为磁盘可以顺序读取这两个文件,从而节省大量磁头移动跨度>
  • 我投了反对票,因为您发布了早期(坏)解决方案的一个小变种,而它应该是评论。
  • 检查大文件的最快方法 :) 非常感谢
【解决方案7】:

使用 cmp 命令。更多信息请参考Binary Files and Forcing Text Comparisons

cmp -b file1 file2

【讨论】:

  • -b 不比较“二进制模式”下的文件。它实际上是“使用 GNU cmp,您还可以使用 -b--print-bytes 选项来显示这些字节的 ASCII 表示。”。这正是我使用您提供的手册的 URL 找到的。
  • Victor Yarema,我不知道你所说的“二进制模式”是什么意思。在我看来,cmp 本质上是一种二元比较。 -b 选项仅打印第一个不同的字节。
【解决方案8】:

为了发现闪存缺陷,我必须编写这个脚本来显示所有包含差异的 1K 块(不仅仅是 cmp -b 的第一个块)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

输出:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

免责声明:我在 5 分钟内破解了脚本。它不支持命令行参数,也不支持文件名中的空格

【讨论】:

  • 我得到“r: not found”(使用 GNU linux)
  • @unseen_rider 哪个外壳,哪一行?请使用sh -x调用脚本进行调试
  • 这是通过从终端调用脚本。线是 9。
  • @unseen_rider 这种方式我帮不了你。剧本没问题。请将您的调试输出发布到pastebin.com。你可以在这里看到我的意思:pastebin.com/8trgyF4A。另外,请告诉我readlink -f $(which sh) 的输出
  • 最后一个命令给出/bin/dash。目前正在 pastebin 上创建粘贴。
【解决方案9】:

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

diff -qs {file1} {file2}

如果您要比较不同目录中的两个同名文件,您可以改用这种形式:

diff -qs {file1} --to-file={dir2}

OS X El Capitan

【讨论】:

    【解决方案10】:

    试试 diff -s

    简答:使用-s 开关运行diff

    长答案:请阅读下文。


    这是一个例子。让我们从创建两个包含随机二进制内容的文件开始:

    $ 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
    

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

    $ cp test1.bin copyoftest1.bin
    

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

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

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

    $ diff test1.bin copyoftest1.bin
    

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

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

    但是有不同的错误码:

    $ diff test1.bin test2.bin
    Binary files test1.bin and test2.bin differ
    
    $ echo $?
    1
    
    
    $ diff test1.bin copyoftest1.bin
    
    $ echo $?
    0
    

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

    $ diff -s test1.bin copyoftest1.bin
    Files test1.bin and copyoftest1.bin are identical
    

    【讨论】:

      【解决方案11】:

      Radiff2 是一个用来比较二进制文件的工具,类似于 常规 diff 比较文本文件。

      试试radiff2,它是radare2反汇编程序的一部分。例如,使用以下命令:

      radiff2 -x file1.bin file2.bin
      

      您会得到格式精美的两列输出,其中突出显示了差异。

      【讨论】:

        【解决方案12】:

        我最喜欢使用 vim 包中的 xxd hex-dumper :

        1) 使用 vimdiff(vim 的一部分)

        #!/bin/bash
        FILE1="$1"
        FILE2="$2"
        vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )
        

        2) 使用差异

        #!/bin/bash
        FILE1=$1
        FILE2=$2
        diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '
        

        【讨论】:

          【解决方案13】:
          md5sum binary1 binary2
          

          如果 md5sum 相同,则二进制文件相同

          例如

          md5sum new*
          89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
          89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
          root@TinyDistro:~# cat new*
          aa55 aa55 0000 8010 7738
          aa55 aa55 0000 8010 7738
          
          
          root@TinyDistro:~# cat new*
          aa55 aa55 000 8010 7738
          aa55 aa55 0000 8010 7738
          root@TinyDistro:~# md5sum new*
          4a7f86919d4ac00c6206e11fca462c6f  new.txt
          89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
          

          【讨论】:

          • 不完全。只有可能性很高。
          • 失败的概率是多少?
          • 苗条,但比使用diff 的某些变体更糟糕,没有理由更喜欢它。
          • 您必须将 MD5 哈希更改为 SHA2 才能使此建议切实可行。如今,任何人的笔记本电脑都可以在 MD5 中生成冲突,并基于这个单一的冲突前缀(2 个相同大小、相同前缀和相同 MD5 的文件)生成无限数量的冲突文件(具有相同的前缀、不同的冲突块、相同的后缀)
          【解决方案14】:

          wxHexEditor

          wxHexEditor 是免费的,并且能够区分高达 2^64 字节(2 ExaByte)的大文件。有一个图形用户界面。跨平台。很多功能。

          要免费获得它,请选择以下选项之一:


          下面是与上面相同的建议。但如果您对这些内容感兴趣,请提供详细信息。

          截图

          实力

          • 十六进制 (Hex) 编辑器。这有助于进行逆向工程。

          • 跨平台。 Linux、Mac OS、Windows

          • 易于使用的图形用户界面 (GUI)

          • 支持高达 2^64 字节 (2 ExaByte) 的超大文件

          • 并排比较两个大文件 (diff)。 (可选)列出并搜索所有差异。

          • 非常快速的搜索

          • 使用少量 RAM

          • 不要创建临时文件。所以它使用的存储空间非常小。

          • 深色或明亮主题

          • 多语言 15 种语言

          • 开源。如果您不熟悉“开源”,则意味着该软件具有更强的安全性和更强的隐私性。因为它的代码在 https://github.com/EUA/wxHexEditor 或 SourceForge https://sourceforge.net/p/wxhexeditor/code/ 上公开供审查和贡献给 GitHub

          • 有吸引力的 GNU 通用公共许可证版本 2。这意味着此扩展的软件代码由友好的非营利社区拥有和支持。而不是营利性公司。 https://github.com/EUA/wxHexEditor/blob/master/LICENSE

          挑战

          • 两个代码库之间的混淆。在撰写本文时,也就是 2021 年 8 月,GitHub 存储库似乎更新了。上次更新是在 2021 年https://github.com/EUA/wxHexEditor 相比之下,https://sourceforge.net/projects/wxhexeditor/ 的 SourceForge 存储库最后一次更新 wxHexEditor 是 2017 年 12 月 31 日。

          表达您的支持

          • 如果您喜欢此应用程序,请通过以下方式向作者和贡献者表示支持:

          ___• 捐款https://www.paypal.com/cgi-bin/webscr?item_name=Donation+to+wxHexEditor&cmd=_donations&business=erdem.ua%40gmail.com

          ___• 通过https://sourceforge.net/projects/wxhexeditor/support 提供票证支持

          ___• 支持论坛https://sourceforge.net/p/wxhexeditor/discussion/

          ___• 补丁https://sourceforge.net/p/wxhexeditor/patches/

          使用

          • wxHexEditor 0.23

          • Debian 10 破坏者

          • GNOME 3.30.2

          【讨论】:

            【解决方案15】:

            有一种比较简单的方法可以检查两个二进制文件是否相同。

            如果您在编程语言中使用文件输入/输出;您可以将两个二进制文件的每一位存储到它们自己的数组中。

            此时检查很简单:

            if(file1 != file2){
                //do this
            }else{
                /do that
            }
            

            【讨论】:

            • 此解决方案不完整。此外,伪代码并不是文字描述的真正实现。
            猜你喜欢
            • 2014-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-14
            • 1970-01-01
            相关资源
            最近更新 更多