让我从经过验证的方法开始,然后指出一些更新的方法。
我见过的处理二进制文件的方法
很久以前,人们将二进制文件的旧版本和新版本扩展为临时“文本”文件(每个字节扩展为3个字节:2个十六进制数字和一个换行符)。
然后通过旧版本的“diff”(肯定无法处理二进制文件)运行这两个“文本”文件来制作补丁文件。
然后我们通过还不是 8 位干净的通信线路传输该“文本”补丁文件。
在接收端,将旧的二进制文件扩展为临时文本版本,然后修补旧的文本文件,然后将新的文本文件压缩回二进制文件(将每对十六进制数字压缩为一个字节,并丢弃换行符和任何可能潜入的回车符)。
最近,我一直在使用rsync(或在其之上构建的一些实用程序,例如 Unison)。
它可以很好地处理任意二进制文件。
我通常会进行实时更新,Unison 在本地计算机上运行,rsync 在文件服务器上运行,彼此来回通信。
无论补丁文件是如何生成的,您都可以使用任何数据压缩实用程序来压缩该文件。
据我所知,应该使用二进制文件的方法
StackOverflow:“如何为二进制差异输出文件创建 PATCH 文件”建议使用bsdiff.
Another StackOverflow问题暗示“vimdiff”似乎可以充分处理任意字节。
StackOverflow:“有用的二进制差异工具”提到了其他一些二进制差异工具。
我听说一些基于 rsync 的工具——”rdiff”和“rdiff-backup”和“口是心非”——允许您创建补丁文件。
然后,收到该补丁文件的人可以使用它将旧的二进制文件更新为新的二进制文件。
The 维基百科声称标准“diff”和“patch”实用程序的最新版本支持二进制文件。
你尝试过吗?
可执行文件压缩的前沿研究
如果您对更新可执行文件时使增量文件尽可能小的前沿研究感兴趣,您将需要查看“小胡瓜的工作原理”作者:Stephen Adams,2009 年,Chromium 项目。
除此之外,接收补丁的计算机“反汇编”旧应用程序,将所有绝对地址和偏移量转换为符号;然后修补反汇编代码;然后将修补后的代码“重新组装”到应用程序的新版本中。