为二进制文件制作补丁的最佳方法是什么?我希望用户可以轻松应用它(简单的patch
应用程序会很好)。在文件上运行diff只会提供Binary files [...] differ
答案 0 :(得分:42)
结帐bsdiff
和bspatch
(website,manpage,paper,GitHub fork)。
要安装此工具:
bzip2.exe
中PATH
的副本;从“二进制”链接here下载。bsdiff
。bsdiff
。答案 1 :(得分:17)
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(website,GitHub)是另一种选择。它似乎是最新的,但我不知道它与其他工具如bsdiff相比如何。
用法:
xdelta -e -s old_file new_file delta_file
xdelta -d -s old_file delta_file decoded_new_file
安装:
choco install xdelta3
brew install xdelta
xdelta
或xdelta3
提供。答案 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 标签
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
只需读入旧文件,然后根据需要编写一个新文件。
不要忘记在文件中包含文件格式版本号,以便您知道如何阅读任何给定版本的文件格式。