介绍
Xdelta3是一款对二进制文件进行增量压缩的开源工具,其同时实现了生成patch包和应用patch包的功能。本系列将会对Xdelta3的源码进行详细解析,本章先介绍Xdelta3工具的使用,后续内容将会持续更新,感兴趣的可以先点个关注哦~
工具使用
该工具支持跨平台使用,为了演示方便,本系列的所有操作将在Linux上进行。
前期准备
仅作为演示需要,我们先用C语言随便写一点内容:
#include <stdio.h>
int add(int a, int b){
return a + b;
}
int main(){
int a = 10;
int b = 20;
int c = add(a, b);
printf("c = %d\n", c);
return 0;
}
这是一个简单的加法函数的定义和调用,将其编译成可执行的二进制文件,并命名为old。

运行一下看看结果:

OK没问题,接着我们对代码进行一些修改:
#include <stdio.h>
int add(int a, int b){
return a + b;
}
int mul(int a, int b){
return a * b;
}
int main(){
int a = 10;
int b = 20;
int c = add(a, b);
int d = mul(a, b);
printf("c = %d\nd = %d\n", c, d);
return 0;
}
修改后的代码增加了乘法函数的定义和调用,同样将其编译成可执行的二进制文件,并命名为new。

同样运行看看结果:

OK,这样我们就得到了两个不一样的二进制文件old和new,当前文件目录为:

准备工作完成,进入下一步。
生成增量文件
使用Xdelta3生成增量文件的命令为:
xdelta3 -v -e -s 源文件名 目标文件名 增量文件名
增量文件也叫patch包,是对两个二进制文件进行差分后得到的产物。这里有两个语义源文件和目标文件,差分是针对源文件进行的,生成的patch包是目标文件相对于源文件的内容增量,我们这里的源文件指的就是old,目标文件指的就是new。
解释一下该命令中几个参数的含义:
-v:输出详细信息,可省略。
-e:encode的首字母,表示编码,要进行差分生成增量文件的时候使用该参数,也可以不加该参数,因为Xdelta3默认就是进行编码操作。
-s:source的首字母,表示源文件,如果有源文件的话必须使用该参数,并且源文件名必须紧跟在该参数之后。
通过命令行执行命令生成增量二进制文件m_delta:

当然也可以省略参数-v和-e:

此时文件目录中就多了一个名为m_delta的二进制文件。
应用增量文件
使用Xdelta3应用增量文件的命令为:
xdelta3 -v -d -s 源文件名 增量文件名 新文件名
该操作是将增量文件应用在源文件(old)上,该源文件必须与编码时的源文件一模一样,将二者通过解码等操作之后得到一个新文件,这个新文件实质上与编码时的目标文件(new)是同一个二进制文件。
这条命令中出现了一个新的参数-d,这是decode的首字母,表示解码,在使用增量文件更新源文件时必须使用此参数,否则就会进行默认的编码操作(将增量文件当作目标文件进行差分)。
通过命令行执行命令将增量文件m_delta应用在源文件old上:

由上图可知,在原本的文件目录中只有增量文件(m_delta)和源文件(old),使用Xdelta3将二者解码合并后生成一个新文件(delta_new),但此时delta_new并不具有可执行权限,我们修改其权限后运行看看结果:

没问题!new_delta的运行结果和编码时的目标文件(new)一模一样。
特殊用法
介绍完常规的增量差分的使用后,我们来介绍Xdelta3的一种特殊用法。
有朋友应该会注意到,在我们编码和解码的命令中都带有参数-s,其目的是表明该编/解码操作需要用到源文件。那这个参数可以省略吗?
当然可以,当我们省略源文件时,编码时的命令就如下:
xdelta3 -v -e 目标文件名 增量文件名
这时Xdelta3的表现就如同数据压缩工具一样,将目标文件的大小压缩成增量文件的大小。同样我们也实际运行演示一下,这次我们将old作为目标文件:

可以看到同样生成了一个增量文件(no_source_delta)(其实更准确的应该叫压缩文件),这时我们再进行解码(或者说解压)操作时也不用带上源文件了,使用的命令就为:
xdelta3 -v -d 压缩文件名 新文件名

可以看到起初文件目录中只有压缩文件(no_source_delta),使用Xdelta3进行解码操作后就生成了一个新文件(no_source_new),其运行后的结果与编码时的目标文件(old)完全一致。
比较一下三个文件的大小:



新文件(no_source_new)与目标文件(old)的大小完全相同,压缩文件(no_source_delta)的大小明显远小于另外两个文件,可见Xdelta3在数据压缩表现同样可观。
再比较一下进行差分编码操作(带有源文件)时生成的增量文件(m_delta)大小:

果然大小还是比单纯的数据压缩操作(不带源文件)生成的压缩文件要小许多,因此我们还是建议能提供源文件的时候尽量带上源文件进行编码操作,这样能够最大限度的减小增量文件的大小。但如果编码时含有源文件,那么解码时也必须要含有源文件才行。
本章小结
Xdelta3通过对目标文件进行编码生成增量文件后,再通过解码增量文件生成与目标文件完全相同的新文件,如果这个过程中含有源文件,那么这个过程就被称作增量更新,否则这个过程与数据压缩无异。
简单说一下这种增量更新的好处,首先相较于文本文件,直接对二进制文件进行操作,省去了二次编译的麻烦,同时服务器上也不太可能使用编译前的文本文件;其次就是相较于直接替换,新旧文件差分生成的增量文件大小要远小于新文件的大小,可以极大的减小内存占用和数据传输成本。
本章内容如有疑问欢迎留言私信我,下一章将介绍增量指令和详细解析,敬请期待~
本文介绍了开源工具Xdelta3的使用方法,包括如何生成和应用增量文件,以及特殊用法。Xdelta3适用于二进制文件的增量压缩,通过编码和解码实现文件更新,有效减少内存占用和数据传输成本。

7965

被折叠的 条评论
为什么被折叠?



