如何创建二进制补丁?

时间:2009-12-22 09:03:40

标签: binary patch

为二进制文件制作补丁的最佳方法是什么?我希望用户可以轻松应用它(简单的patch应用程序会很好)。在文件上运行diff只会提供Binary files [...] differ

9 个答案:

答案 0 :(得分:42)

结帐bsdiffbspatchwebsitemanpagepaperGitHub fork)。

要安装此工具:

  • Windows:下载并解压缩this package。您还需要bzip2.exePATH的副本;从“二进制”链接here下载。
  • macOS:安装Homebrew并使用它来安装bsdiff
  • Linux:使用您的软件包管理器安装bsdiff

答案 1 :(得分:17)

谷歌Chrome团队的

Courgette看起来是二进制修补可执行文件的最有效工具。

引用他们的数据:

  

以下是最近190.1的尺寸 - > 190.4开发人员频道更新:

     
      
  • 完整更新:10,385,920字节
  •   
  • bsdiff更新: 704,512字节
  •   
  • 西葫芦更新: 78,848字节
  •   

以下是instructions to build it。以下a Windows binary来自Mehrdad提供的{{3}}。

答案 2 :(得分:9)

xdelta(websiteGitHub)是另一种选择。它似乎是最新的,但我不知道它与其他工具如bsdiff相比如何。

用法:

  • 创建补丁:xdelta -e -s old_file new_file delta_file
  • 应用补丁:xdelta -d -s old_file delta_file decoded_new_file

安装:

  • Windows:下载official binaries
  • Chocolatey:choco install xdelta3
  • Homebrew:brew install xdelta
  • Linux:在您的软件包管理器中以xdeltaxdelta3提供。

答案 3 :(得分:6)

现代端口:bsdiff / bspatch非常有用的.NET端口:

https://github.com/LogosBible/bsdiff.net

我个人的选择。 我测试了它,它是所有链接中唯一的,我可以开箱即用来编译它(使用Visual Studio,例如2013)。 (其他地方的C ++源代码有点过时,至少需要一点抛光,只有32位设置实际内存(差异源大小)限制。这是这个C ++代码bsdiff的一个端口,甚至测试补丁结果是否相同原始代码)。

进一步的想法:使用.NET 4.5,你甚至可以摆脱#Zip lib,这是一个依赖。

我没有测量它是否稍微慢于c ++代码,但它对我来说很好,(bsdiff:1-2分钟内90 MB文件),对我来说时间关键只是bspatch,不是bsdiff。

我不确定,如果使用x64机器的整个内存,但我认为它。支持x64的版本(“任何CPU”)至少可以工作。尝试使用100 MB文件。

- 此外:如果您的主要目标是可执行文件,引用的Google项目“Courgette”可能是最佳选择。但它是构建它的工作(至少对于Windows测量),对于二进制文件,它也使用纯bsdiff / bspatch,就我所理解的文档而言。

答案 4 :(得分:0)

对于小型,简单的补丁程序,最简单的方法是使用-a(或--text)选项告诉diff将文件视为文本。据我了解,更复杂的二进制差异仅对减小补丁的大小有用。

$ man diff | grep -B1 "as text"
       -a, --text
              treat all files as text
$ diff old new
Binary files old and new differ
$ diff -a old new > old.patch
$ patch < old.patch old
patching file old
$ diff old new
$

如果文件大小相同,并且补丁程序仅修改了几个字节,则可以使用操作系统通常安装的xxd。下面的代码将每个文件转换为每行一个字节的十六进制表示形式,然后对文件进行比较以创建紧凑的补丁程序,然后应用补丁程序。

$ xxd -c1 old > old.hex
$ xxd -c1 new > new.hex
$ diff old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$

答案 5 :(得分:0)

HDiffPatch:https://github.com/sisong/HDiffPatch
可以在以下平台上运行:Windows,macos,linux,android
支持二进制文件或目录之间的差异;
创建补丁:hdiffz [-m|-s-64] [-c-lzma2] old_path new_path out_delta_file
正在应用补丁:hpatchz old_path delta_file out_new_path

安装:
Download from last release,或下载下载源代码并制作;

Jojos Binary Diff:https://sourceforge.net/projects/jojodiff/
另一个好的二进制差异算法;

答案 6 :(得分:0)

diff和git-diff可以通过使用-a将二进制文件视为文本来处理二进制文件。

通过git-diff,您还可以使用--binary来生成二进制文件的ASCII编码,例如适合粘贴到电子邮件中。

答案 7 :(得分:0)

https://github.com/reproteq/DiffPatchWpf DiffPatchWpf DiffPatchWpf 简单的二进制补丁制作工具。

比较两个二进制文件并将它们之间的差异保存在新文件patch.txt中

在另一个二进制文件中快速轻松地应用补丁。

现在您可以快速轻松地将差异应用到另一个二进制文件中。

示例:

1- 加载文件 Aori.bin

2- 加载文件 Amod.bin

3- 比较并保存 Aori-patch.txt

4- 加载文件 Bori.bin

5- 加载补丁 Aori-patch.txt

6- 应用补丁并保存文件 Bori-patched.bin

alt 标签

https://youtu.be/EpyuF4t5MWk

Microsoft Visual Studio 社区 2019

版本 16.7.7

.NETFramework,Version=v4.7.2

在 windows 10x64bits 中测试

答案 8 :(得分:-1)

假设您知道文件的结构,可以使用c / c ++程序逐字节修改它:

http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx

只需读入旧文件,然后根据需要编写一个新文件。

不要忘记在文件中包含文件格式版本号,以便您知道如何阅读任何给定版本的文件格式。