bsdiff算法c语言实现,bsdiff的使用
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
最近刚刚做完ReactNative基于微软的CodePush进行热更新,可是发现一个问题就是,如果每次更新太慢,一个原因可能是微软的CodePush的服务器在国外,那么如何不依赖微软的CodePush服务器实现增量更新呢?看另一篇博客ReactNative之增量升级方案,这里主要针对如何实现增量补丁的打包,以及如何将增量包和旧包合并成新包,通过bsdiff技术实现,下面针对Mac、iOS和Android三个平台进行一一讲解。
bsdiff介绍
bsdiff是一种二进制差分工具,有bsdiff和bspatch组成,将oldfile和newfile做二进制数据差分(即bsdiff操作),得到更新部分(patch文件),再与oldfile进行合并(bspatch操作)成newfile。
废话不多说,先撸一遍代码再说。
Mac下使用bsdiff打开终端安装bsdiff1$ brew install bsdiff使用bsdiff生成xxx.patched补丁文件1$ bsdiff ./Desktop/test/hot_old.zip ./Desktop/test/hot_new.zip ./Desktop/test/hot.patched
使用bspatch生成新包文件1
2# 注意这里的文件路径
$ bspatch ./Desktop/test/hot_old.zip ./Desktop/test/hot_new_patch.zip ./Desktop/test/hot.patched
验证生成的新包是否正确,通过md5值是否相同,相同则生成正确1
2
3
4
5$ md5 ./Desktop/test/hot_new.zip
MD5 (./Desktop/test/hot_new.zip) = bd6c61e552e913d563bc3b16b82fb994
$ md5 ./Desktop/test/hot_new_patch.zip
MD5 (./Desktop/test/hot_new_patch.zip) = bd6c61e552e913d563bc3b16b82fb994
iOS使用bsdiff进行文件资源增量更新(bsdiff/bspatch)
下载bsdiff bzip2文件
iOS集成(xcode10.2)新建一个工程,将下载好的bsdiff、bzip2导入工程中,大致内容如下
编译工程,会报如下错误,意料之中,大致原因是因为存在相同的main函数,我们只需要按照提示一步一步修改方法名字就可以了。
解决办法如下,这里只演示修改一个文件
在编译发现除了main函数重名以外,还有一个错误如下所示
解决办法如下:我们查看bzip2.c和bzip2recover.c,搜索progName字段,发现又是重名了,那么修改即可,这里不做演示,本项目是将bzip2recover.c文件的progName改为progNameRecover再次编译,恭喜你编译成功了~,不成功你找我。
因为bsdiff为C语言编写,oc引用c语言,需要新建一个.h文件,在.h文件中引用bsdiff.c和bspatch的方法(该方法名是我讲main方法改名后的方法名)
并且还需要在bsdiff.c和bspatch.c文件中#include "BsdiffTool.h"
下面进行本地测试,我们本地创建两个文件夹,大致内容如下,然后打包成zip,然后拖入工程中
调用bsdiff方法,生成补丁包patch,项目命名为hot_bsdiff1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/**
生成增量补丁patch包
参数一: 固定字符串
参数二: oldfile文件路径
参数三: newfile文件路径
参数四: 合成patch的文件路径
*/
- (void)bsdiff
{
const char *argv[4];
argv[0] = "bsdiff";
// old path
NSString *oldPath = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"hot_old.zip"];
argv[1] = [oldPath UTF8String];
// new path
NSString *newPath = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"hot_new.zip"];
argv[2] = [newPath UTF8String];
// patched path
argv[3] = [[self createFileWithFileName:@"hot_bsdiff"] UTF8String];
int result = BsdiffUntils_bsdiff(4, argv);
NSLog(@"bsdiff结果:%d",result);
}
此时运行项目,你会发现document路径下会出现一个hot_bsdiff文件,这个文件就是oldfile和newfile文件二进制差分出来的文件,也就是需要更新的文件,但是这个文件不能直接使用,需要我们通过bspatch方法合成新的zip文件。调用bspatch方法,将hot_old.zip + hot_bsdiff(patch增量包) 生成新包hot_new.zip,项目命名为hot_bspatch_new.zip1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/**
根据增量补丁patch包 + 旧包 生成新包
参数一: 为固定字符串
参数二: oldfile文件路径
参数三: oldfile与patch合成zip文件的路径
参数四: 差分出来的patch补丁包文件路径
*/
- (void)bspatch
{
const char *argv[4];
argv[0] = "bspatch";
// old path
NSString *oldPath = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"hot_old.zip"];
argv[1] = [oldPath UTF8String];
// new path
argv[2] = [[self createFileWithFileName:@"hot_bspatch_new.zip"] UTF8String];
// patch path
argv[3] = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"hot_bsdiff"] UTF8String];
int result = BsdiffUntils_bspatch(4, argv);
NSLog(@"bspatch结果:%d",result);
}
运行项目,在对应路径下,就会看到hot_bspatch_new.zip文件,此时解压次安装包,内容如下
至此iOS集成bsdiff完成。
android使用bsdiff
后续更新
参考链接
bsdiff算法c语言实现,bsdiff的使用相关推荐
- bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch)
bsdiff介绍: bsdiff是一种二级制差分工具,由bsdiff与bspatch组成, 将oldfile与newfile做二进制数据差分(bsdiff操作),得到更新的部分(patch文件),再与 ...
- 游戏差异更新—BSDiff算法解析
为何需要差异更新? 差异更新即在软件更新时只更新差异化的部分,以达到用最小的下载量完成软件的更新需求.该思想由来已久,从刚接触电脑时的操作系统.应用软件快速更新功能或填补漏洞,到迭代更加频繁的移动应用 ...
- Qt移植bsdiff算法计算差分文件
一.效果展示 二.原理解析 BSDiff的三个基本步骤如下: 1.对old文件中所有子字符串形成一个字典: 2.对比old文件和new文件,产生diffstring和extra string: 3.将 ...
- c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)
基于朴素贝叶斯分类器的文本分类算法(C语言) 基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情.#include ...
- 《数据结构与算法 C语言版》—— 3.8习题
本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第3章,第3.8节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.8习题 1名 ...
- 《数据结构与算法 C语言版》—— 2.5上机实验
本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.5节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.5上机实验 实 ...
- 《数据结构与算法 C语言版》—— 2.7习题
本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.7节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.7习题 1描 ...
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...
- 每日算法C语言1-求某整数
每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...
最新文章
- UBUNTU 下查看所有的C库函数和查询 LINUX 编成必备
- python有哪些方向、应该怎么学-终于找到深圳学Python,有几个方向?怎么从一个方向学到底...
- 经典算法题每日演练——第十九题 双端队列
- java 变量单例_Java静态变量的用法:伪单例
- 把canvas标签里的图像下载成本地图片文件
- python中单行注释_Python中的单行、多行、中文注释方法
- thinkphp框架学习笔记(1)
- linux舵机控制程序,Linux PWM设备驱动及舵机控制
- matlab2c使用c++实现matlab函数系列教程-abs函数
- RestClient 接口测试实践
- 中国粮食安全问题及其应对措施
- 2021年国内PT站点汇总(中英文名称对照表)很全呦!
- word文档通配符换行_[Word] 学习笔记
- python功能主菜单_Pycharm主菜单学习
- 【Task08】Numpy学习打卡
- jabref java_Jabref安装及使用教程
- shell编程,脚本语言
- Linux 如何挂载nas盘到服务器
- [英语] 一个有两个谓语动词的句子之拆解与分析
- 耳机接口规则_线控缘何不兼容 3.5mm耳机接口的奥秘