差異更新 BSDiff演算法解析

2021-10-23 13:12:57 字數 1632 閱讀 7364

生成字尾陣列

line 230: qsufsort(i,v,old,oldsize);
迴圈處理新檔案資料,找到**操作導致二進位制資料相差位元組多於8bytes的偏移點

while(scanoldscore+8)) break;

if((scan+lastoffset2.1 新版本檔案和老版本檔案都從資料開頭開始,通過二分法,在整個字尾陣列i中找到與新版本資料匹配最長的長度len和陣列編號pos。

len=search(i,old,oldsize,new+scan,newsize-scan,

0,oldsize,&pos);

* search和matchlen函式略。

2.2 計算出當前偏移的old資料與new資料相同的位元組個數,再與len比較。

for(;scscoldscore+8)) break;
2.2.1 如果相差小於8則繼續for迴圈。

2.2.2 如果相差大於8則退出for迴圈,下面則對這一段資料進行處理。

老版本程式:

printf("hello");

....

新版本程式:

printf("world");

....

對上乙個位置到新位置之間的資料進行處理

while(scansf*2-lenf) ;

};, lenb=0;

if(scan=lastscan+i)&&(pos>=i);i++) ;

};};

if(lastscan+lenf>scan-lenb) ;

};lenf+=lens-overlap;

lenb-=lens;

};for(i=0;i3.1 計算diff string的長度

s=0;sf=0;lenf=0;

for(i=0;(lastscan+isf*2-lenf) ;

};

if(s*2-i>sf*2-lenf) ; 

* sf*2-lenf 和 s*2-i 都是等式: a*2 - b。

* sf*2-lenf可以理解為 上一組s和i,s*2-i計算出的值。

* s*2 - i, i和s的增長步長都為1,也就是i走兩步,s走一步就可以維持s*2 - i結果不變,

如果結果要增加,也就是s增加的頻率要》50%,即後續增加的資料超過50%的資料需要是相等的。

3.2 獲取與下一段資料近似相同資料的長度

lenb=0;

if(scan=lastscan+i)&&(pos>=i);i++) ;

};};

3.3 上面兩段資料可能重疊,處理重疊

if(lastscan+lenf>scan-lenb) ;

}; lenf+=lens-overlap;

lenb-=lens;

};

3.4 將diff string和extra string儲存到記憶體中,再將長度資料使用bzip壓縮寫入檔案

for(i=0;i迴圈結束後將記憶體中的diff string和extra string壓縮寫入檔案。

增量更新 bsdiff工具的安裝和使用

tmp ccqwbjxf.o 在函式 main 中 bsdiff.c text startup 0x2e4 對 bz2 bzwriteopen 未定義的引用 bsdiff.c text startup 0xb29 對 bz2 bzwrite 未定義的引用 bsdiff.c text startup ...

IE與FF下css解析差異處理

size medium color orange 大部分都是用 important來hack,對於ie6和firefox測試可以正常顯示 但是ie7對 important可以正確解釋,會導致頁面沒按要求顯示!搜尋了一下,找到乙個針對ie7不錯的hack方式就是使用 html 現在用ie7瀏覽一下,應...

資料狀態更新時的差異diff及patch機制

因為使用了virtual dom,vue.js 具有了跨平台能力 virtual dom只是js物件,是如何呼叫不同平台的 api 的?2.1 舉個栗子const nodeops else if platform web parentnode removechild nextsibling inse...