日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

bsdiff介紹:

bsdiff是一種二級制差分工具,由bsdiff與bspatch組成, 將oldfile與newfile做二進制數(shù)據(jù)差分(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導(dǎo)入工程中,導(dǎo)入文件內(nèi)容:

image.png

編譯工程文件,會報一個函數(shù)重載的error

image.png

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

繼續(xù)編譯項目

回報如下的錯誤,原因是存在相同的main函數(shù),我們按照錯誤提示,到每個方法中進行文件重命名即可。

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文件。

因在本地進行測試,所有正常要在服務(wù)器做的bsdiff操作也需要在本地進行操作

我這里找了6張圖片,其中3張壓縮成zip,作為old文件, 所有的6張壓縮成zip,作為new文件。

調(diào)用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);

}

參數(shù)1:為固定字符串

參數(shù)2:oldfile的文件路徑

參數(shù)3:newfile的文件路徑

參數(shù)4:合成patch的文件路徑

此時,運行項目,會在對應(yīng)路徑下出現(xiàn)一個bsdiff_Test的文件,這個文件就是oldfile與newfile差分出來的文件,也就是需要更新的文件,但是這個文件不是直接就可以使用的,需要我們用bspatch方法將其合成zip文件

調(diào)用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);

}

參數(shù)1:為固定字符串

參數(shù)2:oldfile的文件路徑

參數(shù)3:oldfile與patch合成成zip文件的目標路徑

參數(shù)4:上一步差分出來的patch文件路徑

運行項目,在對應(yīng)路徑下,就會看到Test_Result.zip文件,此時解壓此壓縮包,就為完整的文件。

另外的測試:比如oldfile有5個圖片,newfile有10個圖片,其中old中有三個圖片被刪除了,這時oldfile與newfile進行bsdiff時,patch出來的就是7個文件,這些都可以自行測試,這里就不在此贅述了

總結(jié)

以上是生活随笔為你收集整理的bsdiff算法c语言实现,iOS 使用bsdiff进行资源文件增量更新(bsdiff / bspatch)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。