欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

gzip壓縮文件損壞修復(fù)原理和數(shù)據(jù)恢復(fù)方法

接修復(fù)損壞的gzip壓縮文件之原理篇,再次引用GZIP結(jié)構(gòu)圖:
gzip壓縮文件損壞修復(fù)原理和數(shù)據(jù)恢復(fù)方法
已知修復(fù)一個損壞的gzip文件的關(guān)鍵環(huán)節(jié)在于找到下一個正常壓縮包的起始點(diǎn)。根據(jù)結(jié)構(gòu)圖中的信息可知,每個壓縮包的開始結(jié)構(gòu)中有是否到達(dá)尾部標(biāo)志、使用的哈夫曼樹類型、以及3個哈夫曼樹的樹元素個數(shù)等。如果某個gzip文件中間有一個壞扇區(qū),要找到壞扇區(qū)后的一個正常起點(diǎn),僅需按位右移,一直移位到可以正常解壓的某個位,就可能找到了正確的壓縮包起始。而根據(jù)gzip文件的壓縮作業(yè)窗口為32KB大小推算,這個遍歷不會超過64KB即可找到。在內(nèi)存中快速循環(huán)可以很快找到,但需要有明確的判斷錯誤的方法。
首先可以明確的是結(jié)尾標(biāo)志,應(yīng)該為0(我們是從損壞的點(diǎn)向后查)。而哈夫曼樹類型也大致應(yīng)該是動態(tài)哈夫曼(0x02),cl1的元素個數(shù)應(yīng)該取值為257到286之間(包含邊界),cl2的元素個數(shù)應(yīng)小于等于30,ccl的元素個數(shù)取值可為1-15(包含邊界)。
其實(shí),還可以參考的東西有,解開的哈夫曼樹是否異常,或者通過規(guī)律性原則找到最后一個取值為256的值,但這些算法應(yīng)該是較為麻煩的,有上面的算法連續(xù)校驗(yàn)幾個壓縮塊就足夠了。
具體方法是對gzip的源碼做修改,進(jìn)行遍歷。因時間關(guān)系,未做成通用工程,僅快速修改了部分代碼。大致的修改點(diǎn)為:

十余年的黑山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整黑山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“黑山網(wǎng)站設(shè)計”,“黑山網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

一,找到損壞點(diǎn):

在unzip.c中,
error("invalid compressed data--format violated");
這一行前,獲取當(dāng)前解碼字節(jié)位置即可。
?

二、遍歷找到損壞點(diǎn):

1、inflate.c文件中,改

if (nl > 286 || nd > 30)
#endif
return 1;

為:

if (nl > 286 || nd > 30||nl <257 || nd <1)
#endif
return 1;

2、inflate.c文件中,在int inflate_block(e)函數(shù)中
在如下代碼前

bb = b;?
bk = k;

加入代碼:

if ((t != 2) || (*e != 0))?
return 2;

3、inflate.c文件中,在int inflate_block(e)函數(shù)尾部
把if (t == 0) 與if (t == 1)的情況都直接返回錯誤值2。
?
4、inflate.c文件中,函數(shù)int inflate()中,改

if ((r = inflate_block(&e)) != 0)?
return r;?
end

為:

unsigned t;?????????? /* block type */?
register ulg b;?????? /* bit buffer */?
register unsigned k;? /* number of bits in bit buffer */?
while (inptr <= insize)?
{?
??? unsigned int tptr = inptr;?
??? unsigned int tbk = bk;?
??? unsigned long tbb = bb;?
??? unsigned int twp = wp;?
??? long long tstart = *(long long*)(inbuf + tptr);?
??? if ((r = inflate_block(&e)) != 0)?
??? {?
??????? inptr = tptr;?
??????? bb = tbb;?
??????? bk = tbk;?
??????? wp = twp;?
??????? b = bb;?
??????? k = bk;?
??????? NEEDBITS(1)?
??????? DUMPBITS(1)?
??? }?
??? else?
??? {?
??????? printf("get by?www.datahf.net!"); //也可輸出tstart,bb,bk 值,轉(zhuǎn)載時請保留版權(quán)信息:www.datahf.net張宇?
??? }?
}?

此4步完成后,試著調(diào)試這個錯誤的.gz文件,當(dāng)然,也可以在代碼中解釋完頭部結(jié)構(gòu)后加一個seek,直接seek到損壞位置。
通常情況下,輸出printf(“get by?www.datahf.net!”)這行代碼時,已經(jīng)找到了正確的起始位。
找到起始位后,也可以構(gòu)造或拷貝一個正常的gzip文件頭,再拼接好找到的位流,即可解壓了。(如果位流不是字節(jié)對齊的,可能要全部做位移)。拼接后很多壓縮文件就可以打開甚至于解壓了,不過,有可能會報錯,主要是尾部的校驗(yàn)和大小錯,其實(shí)可以忽略。
如果拼接好了linux下,不能直接用“gzip –d”解壓,因其crc有錯誤,會導(dǎo)致解壓到99%后報錯,然后把文件刪除,換成管道命令即可:

文章標(biāo)題:gzip壓縮文件損壞修復(fù)原理和數(shù)據(jù)恢復(fù)方法
當(dāng)前鏈接:http://chinadenli.net/article44/pgjohe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化面包屑導(dǎo)航App開發(fā)網(wǎng)站內(nèi)鏈商城網(wǎng)站全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作