bsdiff介绍:

bsdiff是一种二级制差分工具,由bsdiff与bspatch组成, 将oldfile与newfile做二进制数据差分(bsdiff操作),得到更新的部分(patch文件),再与oldfile进行合成(bspatch操作)。比如icon增量更新为例,old图片资源有5个icon,new图片资源在之前的5个icon上加了10个新的icon,这是old与new进行bsdiff操作,会生成增量10个icon的patch文件,接下来再与old图片资源进行bspatch操作,最后合成了最新的15个icon图片资源。

bsdiff原理.png

下载bsdiff bzip

开始正题

新建一个工程,将下载好的bsdiff bzip导入工程中,导入文件内容:

image.png

编译工程文件,会报一个函数重载的error

image.png

需要在panic方法前添加__attribute__((overloadable))

继续编译项目

回报如下的错误,原因是存在相同的main函数,我们按照错误提示,到每个方法中进行文件重命名即可。

image.png

此时编译,成功!!!

因为bsdiff为C语言编写,oc引用C需要新建一个pch文件,在pch引用bsdiff.c与bspatch.c的方法(该方法名是我将main方法改成此方法名)

int BsdiffUntils_bsdiff(int argc, char *argv[]);

int BsdiffUntils_bspatch(int argc,char * argv[]);

并在bsdiff.c与bspatch.c中include该pch文件。

因在本地进行测试,所有正常要在服务器做的bsdiff操作也需要在本地进行操作

我这里找了6张图片,其中3张压缩成zip,作为old文件, 所有的6张压缩成zip,作为new文件。

调用bsdiff方法

#pragma Mark - Bsdiff

- (void)Bsdiff

{

const char *argv[4];

argv[0] = "bsdiff";

// oldPath

NSString *path1 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"old.zip"];

argv[1] = [path1 UTF8String];

// newPath

NSString *path2 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"new.zip"];

// argv[2] = argv[1] = [[NSString stringWithFormat:@"file://%@", path2] UTF8String];

argv[2] = [path2 UTF8String];

// patchPath

argv[3] = [[self createFileWithFileName:@"bsdiff_Test"] UTF8String];

int result = BsdiffUntils_bsdiff(4, argv);

}

参数1:为固定字符串

参数2:oldfile的文件路径

参数3:newfile的文件路径

参数4:合成patch的文件路径

此时,运行项目,会在对应路径下出现一个bsdiff_Test的文件,这个文件就是oldfile与newfile差分出来的文件,也就是需要更新的文件,但是这个文件不是直接就可以使用的,需要我们用bspatch方法将其合成zip文件

调用bspatch方法

#pragma Mark - Bspatch

- (void)Bspatch

{

const char *argv[4];

argv[0] = "bspatch";

// oldPath

NSString *path1 = [NSString stringWithFormat:@"/%@/%@",[NSBundle mainBundle].bundlePath, @"old.zip"];

argv[1] = [path1 UTF8String];

// newPath

argv[2] = [[self createFileWithFileName:@"Test_Result.zip"] UTF8String];

// patchPath

argv[3] = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"bsdiff_Test"] UTF8String];

int result = BsdiffUntils_bspatch(4, argv);

}

参数1:为固定字符串

参数2:oldfile的文件路径

参数3:oldfile与patch合成成zip文件的目标路径

参数4:上一步差分出来的patch文件路径

运行项目,在对应路径下,就会看到Test_Result.zip文件,此时解压此压缩包,就为完整的文件。

另外的测试:比如oldfile有5个图片,newfile有10个图片,其中old中有三个图片被删除了,这时oldfile与newfile进行bsdiff时,patch出来的就是7个文件,这些都可以自行测试,这里就不在此赘述了

bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch)相关推荐

  1. iOS开发实现资源包增量更新

      所谓资源包的增量更新是指,比如有一个资源包1.0版本, 现在如果升级到1.1本,那么只需要将1.0的版本信息发送给服务端,服务器端返回一个差分包.将这个差分包和本地的1.0的资源包进行合并生成1. ...

  2. bsdiff算法c语言实现,bsdiff的使用

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近刚刚做完ReactNative基于微软的CodePush进行热更新,可是发现一个问题就是,如果每次更新太慢,一个原因 ...

  3. Android增量更新 bsdiff bspatch库加入到Android工程

    最近项目中要使用增量更新去下载更新我们app内部的H5离线资源包,现把遇到的问题总结一下 用到的库 都要科学上网 bsdiff 第一次进入官网感觉很懵逼,没找到download的字眼,不要急,慢慢往下 ...

  4. c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩

    有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:http:/ ...

  5. 批量处理ios破解后的资源文件为android所用

    这两天把ios上的应用破解了,把它的资源全部拷贝到android上使用. 但是ios上的资源很多包含android不允许的特殊字符,比如*@2x.png这样结尾的资源.这里面包含了@这个特殊字符.需要 ...

  6. android 反编译替换资源文件,[求助]想替换微信5.0的一个语言包,但是反编译资源文件出现错误。...

    想为微信5.0中替换进去一个少数民族语言包,但是反编译时出现大量以下类似的错误,而且无法正确回编译,试过了基本所有apktool的版本都无法解决,无奈只能求助各位前辈,请告知解决此问题的方法或思路.谢 ...

  7. iOS基础:获取资源文件的方法

    bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle,cocoa提供了类NSBund ...

  8. Android与iOS资源文件读写对比

    在开发中,算法配置文件是作为独立资源文件存在,初始化的时候读取到应用中,因此有必要对Android和iOS系统下的资源文件读写有一定的了解. 首先要搞清楚的一点是,我们在PC上开发时使用的所有资源,移 ...

  9. 利用资源文件实现多语言的系统

    以前很少接触多语言的系统,公司里有个比较不错的portal项目, 我看了有实现多语言的功能, 了解了下它的基本原理:利用资源文件保存不同的语言内容:例如中文一个资源文件, 英文一个资源文件, 日文.. ...

最新文章

  1. 探秘重编译(Recompilations)(1/2)
  2. 三面腾讯,竟然挂在了JVM上…
  3. HDU 1430 魔板(康托展开+BFS+预处理)
  4. 入门训练 序列求和 c语言
  5. python plt画半对数坐标_特征工程大传:对数变换
  6. mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置
  7. 建立你第一个 Outlook Add-in
  8. 让我的网站变成响应式的3个简单步骤
  9. angelajs中ajax,Fabric.js Triangle angle属性用法及代码示例
  10. 微信小程序点餐页面实现完整版
  11. conda install labelimg 预定标签类别
  12. 丑数 打表+二分查找
  13. 干得好也要说得好| 这样向领导汇报,让你在职场上如鱼得水
  14. dwc3_gadget_get_link_state
  15. 纳尼?华为首席架构师只用434页笔记,就将网络协议给拿下了
  16. boost::string_algo库详解
  17. 《Python神经网络编程》自己动手编写一个神经网络
  18. Ubuntu18.04LTS系统编译Android所需安装的一些插件内容
  19. 数学公式——海伦公式
  20. 匹兹堡大学计算机科学世界排名,2020年匹兹堡大学QS世界排名

热门文章

  1. 迷阵突围(dijkstra求次短路径)
  2. Java中四个访问修饰符public private protected 和默认(package-private)的用法详解
  3. SAPMM模块不同维度采购模式分类
  4. 重磅!《中国迈向新一代人工智能》全文来了。道翰天琼认知智能平台为您揭秘新一代人工智能-1。
  5. 〖产品思维训练白宝书 - 核心竞争力篇⑤〗- 产品经理核心竞争力解读之如何培养创造力
  6. 闪动的TextView
  7. 计算机命中率的概念,命中率
  8. mp3 文件专辑封面 一点点知识
  9. 市盈率指标详解及相关文献概述
  10. SAP中标准外协加工中成品收货时下级组件反冲利润中心确定控制逻辑