加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、bsdiff4基礎(chǔ)
    • 二、代碼舉例
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

C語言實(shí)例:如何利用bsdiff4給你的版本制作升級(jí)包文件并還原?

12/04 12:40
1038
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、bsdiff4基礎(chǔ)

bsdiff4 是一個(gè)用于生成和應(yīng)用二進(jìn)制差異補(bǔ)丁的開源項(xiàng)目。它基于 BSDIFF4 格式,主要用于在不同版本的二進(jìn)制文件之間生成差異補(bǔ)丁,并可以將這些補(bǔ)丁應(yīng)用到原始文件上,從而生成目標(biāo)文件。

bsdiff4 的核心功能包括生成差異補(bǔ)丁 (diff) 和應(yīng)用補(bǔ)丁 (patch)。

1. bsdiff4特點(diǎn)

該項(xiàng)目的主要特點(diǎn)包括:

    支持生成和應(yīng)用 BSDIFF4 格式的二進(jìn)制補(bǔ)丁。提供了 Python 接口,方便在 Python 項(xiàng)目中使用。支持命令行工具 bsdiff4 和 bspatch4,可以直接在命令行中使用。

2. 資源下載

https://gitcode.com/

3. 應(yīng)用場(chǎng)景

bsdiff4 在以下場(chǎng)景中非常有用:

軟件更新:
在軟件更新時(shí),可以使用 bsdiff4 生成補(bǔ)丁文件,用戶只需下載補(bǔ)丁文件并應(yīng)用到舊版本上,從而節(jié)省帶寬和時(shí)間。

版本控制:
在版本控制系統(tǒng)中,可以使用 bsdiff4 生成不同版本之間的差異補(bǔ)丁,便于管理和回滾。

優(yōu)化補(bǔ)丁大?。?br /> 在生成補(bǔ)丁時(shí),盡量選擇差異較大的文件進(jìn)行比較,以減少補(bǔ)丁文件的大小。

驗(yàn)證補(bǔ)?。?br /> 在應(yīng)用補(bǔ)丁之前,建議對(duì)補(bǔ)丁文件進(jìn)行驗(yàn)證,確保補(bǔ)丁文件的完整性和正確性。

軟件更新與補(bǔ)丁管理:
在軟件發(fā)布過程中,開發(fā)者可以使用 bsdiff4 生成新舊版本之間的差異補(bǔ)丁,用戶只需下載并應(yīng)用補(bǔ)丁即可完成更新,大大減少了數(shù)據(jù)傳輸量和更新時(shí)間。

版本控制系統(tǒng):
在版本控制系統(tǒng)中,bsdiff4 可以用于計(jì)算不同版本文件之間的差異,幫助開發(fā)者更好地管理和回滾文件版本。

嵌入式系統(tǒng)更新:
在資源受限的嵌入式系統(tǒng)中,bsdiff4 可以用于生成和應(yīng)用更新補(bǔ)丁,減少更新所需的存儲(chǔ)空間和帶寬。

數(shù)據(jù)備份與恢復(fù):
在數(shù)據(jù)備份與恢復(fù)過程中,bsdiff4 可以幫助用戶生成增量備份,減少備份數(shù)據(jù)的大小,提高恢復(fù)效率。

4. 典型生態(tài)項(xiàng)目

bsdiff4 可以與其他開源項(xiàng)目結(jié)合使用,以增強(qiáng)其功能和應(yīng)用場(chǎng)景:

    • Git:
    • 可以將 bsdiff4 集成到 Git 中,用于生成和應(yīng)用二進(jìn)制文件的差異補(bǔ)丁。
    • Delta:
    • Delta 是一個(gè)基于 bsdiff 的版本控制系統(tǒng),可以與 bsdiff4 結(jié)合使用,提供更高效的版本管理功能。
    通過這些生態(tài)項(xiàng)目的結(jié)合,bsdiff4 可以在更廣泛的場(chǎng)景中發(fā)揮作用,提升開發(fā)效率和用戶體驗(yàn)。

二、代碼舉例

本文只舉例如何編程在ubuntu上運(yùn)行。

解壓縮官方的壓縮包:

peng@ubuntu:~/work/fdw/code/bsdiff/bsdiff$?ls
bsdiff.c??bsdiff.h??bspatch.c??bspatch.h??build???build.sh??bzlib??CMakeLists.txt??imgs??main.c??project??README.md??res

這些文件中最重要的就是bsdiff.c bspatch.c

其中

bsdiff,用于生成補(bǔ)丁文件,

bspatch用與根據(jù)補(bǔ)丁文件將文件升級(jí)為最新文件

bzlib ?包含bsdiff算法用到的zb壓縮算法庫

這2個(gè)文件中包含實(shí)現(xiàn)對(duì)應(yīng)功能的源碼,同時(shí)也可以編譯成獨(dú)立的可執(zhí)行程。

1)編譯生成獨(dú)立的可執(zhí)行程序

要想編譯生成獨(dú)立可執(zhí)行程序,只需要在文件中加上宏定義即可

bsdiff.c

bspatch.c

編譯
gcc?bsdiff.c?-o?bsdiff?bzlib/*.c?-I./bzlib
gcc?bspatch.c?-o?bspatch??bzlib/*.c?-I./bzlib

看下這兩個(gè)命令的參數(shù):

peng@ubuntu:~/work/fdw/code/bsdiff/bsdiff$?./bsdiff
bsdiff:?usage:?./bsdiff?oldfile?newfile?patchfile


peng@ubuntu:~/work/fdw/code/bsdiff/bsdiff$?./bspatch
bspatch:?usage:?./bspatch?oldfile?newfile?patchfile
bsdiff給2個(gè)文件生成補(bǔ)丁文件

假設(shè)我們有一個(gè)文件oldfile,現(xiàn)在我們修改后形成新的文件newfile,

利用bsdiffoldfile打上補(bǔ)丁,并生成補(bǔ)丁文件文件patchfile

    第一步:

創(chuàng)建oldfile :

this?is?old?file
    第二步:

在oldfile基礎(chǔ)上新增內(nèi)容,保存為newfile

this?is?old?file
yikoupeng?add?,this?is?newfile
    利用bsdiff生成patchfile
./bsdiff?oldfile?newfile?patchfile

通過bspatch給舊的文件打上補(bǔ)丁

利用bspatcholdfile打上補(bǔ)丁文件patchfile,并生成新的文件testfile,

如果成功,那么testfile應(yīng)該與前面的newfile完全一致。

./bspatch?oldfile?testfile??patchfile?

通過MD5校驗(yàn),可以看到newfiletestfile ?內(nèi)容完全相同。

2)通過api操作

    api 接口說明

以下是 bsdiff4 提供的主要功能:

int?bsdiffFile(const?char*?oldfile,?const?char*?newfile,?const?char*?patchfile)
功能:
?將oldfile、newfile生成補(bǔ)丁文件文件patchfile
參數(shù):
?oldfile:初始版本文件
?newfile:修改后的最新的版本文件
?patchfile:補(bǔ)丁文件
返回值
?成功:0
?失?。贺?fù)值
int?bsPatchFile(const?char?*oldfile,?const?char?*newfile,?const?char?*patchfile)
功能:
?將oldfile打上補(bǔ)丁文件文件patchfile,生成新的文件newfile
參數(shù):
?oldfile:初始版本文件
?newfile:打上補(bǔ)丁后的文件
?patchfile:補(bǔ)丁文件
返回值
?成功:0
?失?。贺?fù)值

下面我們編寫一個(gè)例子,實(shí)現(xiàn)給上述的oldfile,打上補(bǔ)丁文件patchfile,最終生成最新的文件yikoufile,

為了方便大家以后移植到自己的項(xiàng)目里,一口君把核心代碼單獨(dú)拎出來,建立了新的工程,

peng@ubuntu:~/work/fdw/code/bsdiff/bsdiffyikou$?tree?./
./
├──?bsdiff.c
├──?bsdiff.h
├──?bspatch.c
├──?bspatch.h
├──?bzlib
│???├──?blocksort.c
│???├──?bzlib.c
│???├──?bzlib.h
│???├──?bzlib_private.h
│???├──?CMakeLists.txt
│???├──?compress.c
│???├──?crctable.c
│???├──?decompress.c
│???├──?huffman.c
│???└──?randtable.c
├──?main.c
├──?newfile
├──?oldfile
├──?patchfile
└──?testfile

1?directory,?19?files

gcc?*.c?./bzlib/*.c?-I./bzlib?-o?run

需要交叉編譯、移植到開發(fā)板或者安卓程序,自行修改編譯工具環(huán)境即可。

源碼獲取

公眾號(hào)后臺(tái)回復(fù):bsdiff

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。