久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么

本文小編為大家詳細(xì)介紹“gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

創(chuàng)新互聯(lián)建站總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)絡(luò)營(yíng)銷策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、微信小程序、軟件開(kāi)發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!

接修復(fù)損壞的gzip壓縮文件之原理篇,再次引用GZIP結(jié)構(gòu)圖:
gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么

已知修復(fù)一個(gè)損壞的gzip文件的關(guān)鍵環(huán)節(jié)在于找到下一個(gè)正常壓縮包的起始點(diǎn)。根據(jù)結(jié)構(gòu)圖中的信息可知,每個(gè)壓縮包的開(kāi)始結(jié)構(gòu)中有是否到達(dá)尾部標(biāo)志、使用的哈夫曼樹(shù)類型、以及3個(gè)哈夫曼樹(shù)的樹(shù)元素個(gè)數(shù)等。如果某個(gè)gzip文件中間有一個(gè)壞扇區(qū),要找到壞扇區(qū)后的一個(gè)正常起點(diǎn),僅需按位右移,一直移位到可以正常解壓的某個(gè)位,就可能找到了正確的壓縮包起始。而根據(jù)gzip文件的壓縮作業(yè)窗口為32KB大小推算,這個(gè)遍歷不會(huì)超過(guò)64KB即可找到。在內(nèi)存中快速循環(huán)可以很快找到,但需要有明確的判斷錯(cuò)誤的方法。

首先可以明確的是結(jié)尾標(biāo)志,應(yīng)該為0(我們是從損壞的點(diǎn)向后查)。而哈夫曼樹(shù)類型也大致應(yīng)該是動(dòng)態(tài)哈夫曼(0x02),cl1的元素個(gè)數(shù)應(yīng)該取值為257到286之間(包含邊界),cl2的元素個(gè)數(shù)應(yīng)小于等于30,ccl的元素個(gè)數(shù)取值可為1-15(包含邊界)。
其實(shí),還可以參考的東西有,解開(kāi)的哈夫曼樹(shù)是否異常,或者通過(guò)規(guī)律性原則找到最后一個(gè)取值為256的值,但這些算法應(yīng)該是較為麻煩的,有上面的算法連續(xù)校驗(yàn)幾個(gè)壓縮塊就足夠了。

具體方法是對(duì)gzip的源碼做修改,進(jìn)行遍歷。因時(shí)間關(guān)系,未做成通用工程,僅快速修改了部分代碼。大致的修改點(diǎn)為:

一,找到損壞點(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)的情況都直接返回錯(cuò)誤值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)載時(shí)請(qǐng)保留版權(quán)信息:www.datahf.net張宇 
    } 
}


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

讀到這里,這篇“gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:gzip壓縮文件底層結(jié)構(gòu)及文件損壞的修復(fù)方法是什么
本文路徑:http://sd-ha.com/article24/gcjije.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、做網(wǎng)站、域名注冊(cè)全網(wǎng)營(yíng)銷推廣、定制開(kāi)發(fā)網(wǎng)站策劃

廣告

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

微信小程序開(kāi)發(fā)