二进制差异是否有流行的 Linux/Unix 格式?

Is there a popular Linux/Unix format for binary diffs?

我将生成数 GB 文件的二进制增量。

天真地,我打算使用以下格式:

struct chunk {
    uint64_t offset;
    uint64_t length;
    uint8_t data[];
};

struct delta {
    uint8_t file_a_checksum[32]; // These are calculated while the
    uint8_t file_b_checksum[32]; // gzipped chunks are being written
    uint8_t chunks_checksum[32]; // at the 96 octet offset.
    uint8_t gzipped_chunks[];
};

我只需要将这些增量应用于用于生成增量的原始 file_a

这里有什么我遗漏的吗?

是否有现有的二进制增量格式具有我正在寻找的功能,但不是太复杂?

对于任意二进制文件,使用通用工具当然是有意义的:

  • xdelta
  • bspatch
  • rdiff-备份(rsync)
  • git 差异

(是的,git diff 适用于不受版本控制的文件。git diff --binary --no-index dir1/file.bin dir2/file.bin

在编写您自己的工具之前,我通常会推荐一个通用工具,即使有一点开销。虽然上面列表中的 none 工具以与 "unified diff" 格式一样普遍存在的格式生成二进制差异,但它们都是 "close to" 标准工具。

还有一种可能与您相关的相当标准化的格式:简陋的 hexdump。 xxd 工具默认将二进制文件转储为相当标准的文本格式:

0000050: 2020 2020 5858 4428 3129 0a0a 0a0a 4e08      XXD(1)....N.

也就是偏移量后跟一系列的字节值。确切的格式是灵活的,并且可以使用命令行开关进行配置。

但是,xxd 也可以在反向模式下使用 写入 那些字节而不是转储它们。

因此,如果您有一个名为 patch.hexdump 的文件:

00000aa: bbccdd

然后运行 xxd -r patch.hexdump my.binary会修改文件my.binary修改三个字节偏移量0xaa.

最后,我还要提到 dd 可以搜索二进制文件和 read/write 给定的字节数,所以我想你可以使用 "shell script with dd commands" 作为你的补丁格式.