二进制文件比较

拖入两个文件,本页就在浏览器内对它们做逐字节比较:每一个差异偏移、带上下文的十六进制 diff、差异密度图,以及能显示哪些比特位发生了变化的比特级分析。另有独立的块对齐模式,可检测文件中部的插入与删除 — 这是普通逐字节 diff 无法对齐的情形。结果可导出 TXT 和 CSV。任何东西都不会被上传。若要编辑字节而非比较,见 高级十六进制编辑器;文本比较则用 文本 Diff 工具。
文件 A
把第一个文件拖到这里,或点击选择
最大 200 MB。文件留在本机。
文件 B
把第二个文件拖到这里,或点击选择
将与文件 A 比较。
每个差异周围的十六进制上下文:  — 相距不足 16 字节的相邻差异会合并为一个块显示。
选择两个文件并比较后,比较摘要会显示在这里。
逐字节 diff 把偏移 N 对到偏移 N。如果某个文件的中部被插入或删除了字节,其后所有内容都会移位,普通 diff 会把整个尾部都报告为不同。本模式对 1 KB 的块做哈希,在两个文件之间匹配这些块,并以复制 / 插入 / 删除操作的形式报告结果 — 与 xdelta 这类 delta 工具看待变化的方式一致。两个文件都不超过 64 MB 时可用。
隐私:两个文件都由浏览器自己的 FileReader 读取并在这个标签页内比较 — 没有服务器、没有上传、没有存储。大文件按 1 MB 分片比较,即使 200 MB 的输入也不会一次性整体驻留内存(除非运行块对齐视图,它工作时会把两个文件都载入)。

什么是二进制文件比较?

二进制比较把两个文件从字节 0 对齐后向前走,报告每一个字节不同的偏移 — 相当于浏览器版的经典 cmp -l 命令。文本 diff 工具做不到这一点:它们要么被不可打印字节卡住,要么用某种字符编码悄悄重新解释文件。二进制比较把两个文件当作它们本来的样子 — 字节数组 — 这正是固件镜像、磁盘转储、数据库文件、加密数据块或任何未知格式文件所需要的。

三个问题在三种深度上得到回答。「它们相同吗?」是校验和问题 — 哈希工具回答得最快,但只有是/否。「它们在哪里不同?」是本页的逐字节 diff:偏移、取值、翻转了哪些比特。「这是哪类变化?」是块对齐视图补充的 — 差异是原位编辑、插入的数据块还是删除的数据块。

逐字节 diff 与块对齐 — 为什么要两种视图?

情形逐字节 diff 的说法块对齐视图的说法
某字段被原位覆盖(文件大小不变)零散的几个差异偏移相同,外加「其余全部复制」
文件 B 的偏移 2000 处插入了 1 KB从 2000 起「全部不同」复制 0–2000,插入 1 KB,复制其余
文件 B 中部删除了一个块从那一点起「全部不同」复制到缺口处,删除 N 字节,复制其余
文件 B 是文件 A 前面加了不同的头部整个文件「不同」删除头部,然后一整段复制 — 即恒定偏移

逐字节 diff 永远是正确的 — 这些字节确实在这些偏移上不同。变化的只是解读:一旦有字节被插入或删除,解读就会移位,就像在文本文件开头加一行会让后面所有行号都变了一样。

如何解读比特级分析

对每个不同的字节,本页计算 A XOR B 并统计哪些比特位被置位。这个直方图出人意料地有表现力:差异集中在比特 0(每个字节的最低有效位)是 LSB 隐写的指纹 — 隐藏消息靠微调像素或音频采样的最低位藏身。差异均匀分布在全部八个位上,说明整个值被重写了。只动高位的差异,通常意味着某个字段被换成了数量级差别很大的值。汉明距离(翻转比特的总数)用一个数字量化同一件事。

一个诚实的提醒:随机数据在任何给定字节上都有 1/256 的概率巧合相同,所以两个毫无关系的同大小文件仍会在约 0.4% 的字节上一致。99.98% 的相似度加少数几个短差异块是补丁级变化;0.4% 的相似度则说明两个文件干脆无关。

常见错误

「第一个差异之后整个文件都红了。」 — 这就是上面说的移位效应,不是真的损坏。运行块对齐视图:如果它报告一次插入加两段长复制,那两个文件就恰好只差那一块。「校验和匹配但这里显示不同。」 — 如果 SHA-256 摘要一致,文件就不可能不同;请检查两个工具里打开的是否是同一批文件。而 CRC-32 匹配在面对蓄意碰撞时什么也证明不了。「相似度 0.4%,可我只改了一处。」 — 如果你的修改在压缩或加密容器内(ZIP、PNG zTXt、加密卷),一处逻辑变化会重写整段压缩流。

常见问题

大小限制是多少? — 逐字节 diff 每个文件最大 200 MB,按 1 MB 分片比较。块对齐视图要载入两个文件,所以每侧限 64 MB。
能检测被移动的块吗? — 对齐器按顺序匹配块;移到别处的块会显示为一次删除加一次相同内容的插入 — 这是个正确但略显生硬的描述。
能生成补丁文件吗? — 不能,它是分析工具;CSV 和 TXT 报告用于记录与审阅,不能用来套用更改。
我的文件会怎样? — 什么都不发生:没有服务器、没有存储、没有分析;关掉标签页,输入的每个字节都消失了。