生成字尾陣列
line 230: qsufsort(i,v,old,oldsize);
迴圈處理新檔案資料,找到**操作導致二進位制資料相差位元組多於8bytes的偏移點
2.2 計算出當前偏移的old資料與new資料相同的位元組個數,再與len比較。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函式略。
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) ;
};
3.2 獲取與下一段資料近似相同資料的長度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.3 上面兩段資料可能重疊,處理重疊lenb=0;
if(scan=lastscan+i)&&(pos>=i);i++) ;
};};
3.4 將diff string和extra string儲存到記憶體中,再將長度資料使用bzip壓縮寫入檔案if(lastscan+lenf>scan-lenb) ;
}; lenf+=lens-overlap;
lenb-=lens;
};
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...