基于lz77算法的分區(qū)編碼壓縮方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別是涉及一種基于LZ77算法的分區(qū)編碼壓縮方法,適合于計(jì)算機(jī)數(shù)據(jù)的快速壓縮和快速解壓縮應(yīng)用。
【背景技術(shù)】
[0002]1977年以色列教授Jcacob Ziv和Abraham Lempel提出了著名的LZ77算法。如今,LZ77算法已被廣泛應(yīng)用于各種數(shù)據(jù)壓縮處理領(lǐng)域,由其派生的各種壓縮算法也層出不窮,但都是屬于LZ77算法這一大類。目前,各壓縮算法不斷改進(jìn),一個(gè)完美的壓縮算法不僅要達(dá)到較高的壓縮率,也對(duì)算法健壯性具有較高要求,同時(shí),也要求算法具有快速處理能力,以適應(yīng)信息技術(shù)領(lǐng)域不斷高速發(fā)展的需求。而本發(fā)明即是一種LZ77派生算法,因其具有獨(dú)創(chuàng)性的編碼方式,所以具備了極快速處理,較高的壓縮率,較強(qiáng)的健壯性等特點(diǎn),是一種非常優(yōu)秀的LZ77類的派生算法。
【發(fā)明內(nèi)容】
[0003]為了提供一種快速高效的壓縮解壓算法,本發(fā)明的技術(shù)方案是,
[0004]一種基于LZ77算法的分區(qū)編碼壓縮方法,包括以下步驟:
[0005]壓縮步驟:
[0006]步驟1:采用哈希表獲得待壓縮數(shù)據(jù)的壓縮序列:(off,lenC,lenL,原始碼)序列;
[0007]步驟2:對(duì)于(off,lenC,lenL,原始碼)序列進(jìn)行臨時(shí)變量替換,令T_lenC =lenC-4,替換原序列的IenC分量,生成新的序列(off,T_lenC,lenL,原始碼)序列;
[0008]步驟3:對(duì)于(off,T_lenC,lenL,原始碼)序列進(jìn)行分區(qū)編碼;
[0009]首先將(off,T_lenC,lenL,原始碼)序列進(jìn)行分區(qū)處理,使用分區(qū)a區(qū)存放三元組(off,T_lenC,IenL)序列,使用分區(qū)b區(qū)存放原始碼序列,然后執(zhí)行編碼方案生成a區(qū)的二次壓縮數(shù)據(jù),編碼方案采用快速編碼方法或緊湊編碼方法,采用快速編碼方法轉(zhuǎn)至步驟4執(zhí)行,采用緊湊編碼方法轉(zhuǎn)至步驟5執(zhí)行:
[0010]步驟4:快速編碼方法,
[0011]將三元組(off,T_lenC,lenL)臨時(shí)區(qū)的單個(gè)三元組表項(xiàng)結(jié)構(gòu)定義為4字節(jié)結(jié)構(gòu),其中off元素以2字節(jié)表示,T_lenC和IenL分別以I字節(jié)表示,整個(gè)臨時(shí)區(qū)由若干個(gè)連續(xù)的三元組表項(xiàng)組成,然后對(duì)所有的(off,T_lenC,lenL)三元組進(jìn)行預(yù)處理,以消除T_lenC和IenL的值超過(guò)255的情況,然后將預(yù)處理以后的三元組序列(off,T_lenC,lenL)存放在臨時(shí)區(qū),對(duì)臨時(shí)區(qū)數(shù)據(jù)進(jìn)行二次壓縮編碼,具體編碼規(guī)則如下:將每一個(gè)(off,T_lenC,lenL)三元組表示為壓縮前綴三元組(a,b,c)和短碼本體三元組(x,y,z),其中a+x編碼off, b+y編碼T_lenC,c+z編碼lenL,a為2位標(biāo)志位,若a = 0,表示x占用4位,若a =1,表示X占用8位,若a = 2,表示X占用12位,若a = 3,表示x占用16位,b為I標(biāo)志位,若b = 0,表示y占用4位,若b = 1,表示y占用8位,c為I位標(biāo)志位,若c = 0,表示z占用4位,若c = 1,表示z占用8位;將(off,T_lenC,lenL)三元組表示為壓縮前綴三元組(a, h, c)和短碼本體三元組(X,y,z)后,將前綴三元組(a,h, c)存放在c區(qū),將短碼本體三元組(X,y,z)存放在d區(qū);
[0012]對(duì)所有的(off,T_lenC,lenL)三元組完成編碼后,形成兩個(gè)存放數(shù)據(jù)的分區(qū)c區(qū)和d區(qū),這兩個(gè)分區(qū)構(gòu)成原有的用于存放三元組序列的分區(qū)a區(qū),完成編碼,跳至步驟8 ;
[0013]步驟5:緊湊編碼方法,
[0014]首先判斷輸入數(shù)據(jù)流的長(zhǎng)度,小于等于8192字節(jié)時(shí)執(zhí)行步驟6,否則執(zhí)行步驟7 ;
[0015]步驟6:對(duì)于三元組(off,T_lenC,lenL),
[0016]a.若lenL〈3,則IenL用2位二進(jìn)制數(shù)表示,再加一位前綴位,將其編碼為0ΧΧ,并存放到c區(qū);
[0017]b.若18> = lenL> = 3,用4位二進(jìn)制表示(lenL_3)的值,再加一位前綴位1,編碼為1XXXX,并存放到c區(qū);
[0018]c.若lenL>18,用16位二進(jìn)制數(shù)表示IenL的值,將值存放到d區(qū),并生成一個(gè)特殊標(biāo)志011的3位二進(jìn)制數(shù),存放到c區(qū);
[0019]d.若T_lenC〈4且off〈512,則T_lenC用2位二進(jìn)制數(shù)表示,off可用9位二進(jìn)制數(shù)表示,再加上2位前綴位00,將(off,T_lenC)編碼為00+ΧΧ以及XXXXXXXXX,存放到c區(qū);
[0020]e.若 T_lenC<4 且 512< = off〈8192,則 T_lenC 用 2 位二進(jìn)制數(shù)表示,off 用 13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)為01的前綴位,將(off,T_lenC)編碼為01+XX以及XXXXXXXXXXXXX,存放到 c 區(qū);
[0021]f.若 4〈 = T_lenC〈19 且 off〈512,則(T_lenC_4)用 4 位二進(jìn)制數(shù)表示,off 可用9位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)10的前綴位,將(off,T_lenC)編碼為10+XXXX以及XXXXXXXXX,存放到C區(qū);
[0022]g.若 4〈 = T_lenC〈19 且 512< = off〈8192,則(T_lenC_4)用 4 位二進(jìn)制數(shù)表示,off用13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)11前綴位,將(off,T_lenC)編碼為11+XXXX 以及 XXXXXXXXXXXXX,存放到 c 區(qū);
[0023]h.gT_lenC> = 19 且 off〈512,則 T_lenC用 16 位二進(jìn)制數(shù)表示,off 用 9 位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)前綴位10,將(off,T_lenC)編碼為10+1111以及XXXXXXXXX,存放到c區(qū),同時(shí),將16位二進(jìn)制數(shù)表示的T_lenC的值存放到d區(qū);
[0024]1.若 T_lenC> = 19 且 512〈 = off〈8192,則 T_lenC 用 16 位二進(jìn)制數(shù)表示,off 用13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)前綴位11,將(off,T_lenC)編碼為11+1111以及XXXXXXXXXXXXX,并將其存放到c區(qū),同時(shí),將16位二進(jìn)制數(shù)表示的T_lenC的值存放到d區(qū);
[0025]完成編碼,跳至步驟8 ;
[0026]步驟7:
[0027]a.若lenL〈3,則IenL用2位二進(jìn)制數(shù)表示,再加一位前綴位,編碼為0ΧΧ,并存放到c區(qū);
[0028]b.若18> = lenL> = 3,用4位二進(jìn)制表示(lenL_3)的值,再加一位前綴位1,將IenL分量編碼為1XXXX,并將其存放到c區(qū)。
[0029]c.若lenL>18,用16位二進(jìn)制數(shù)表示IenL的值,將IenL的值存放到d區(qū),并生成一個(gè)3位二進(jìn)制數(shù)的特殊標(biāo)志011,存放到c區(qū);
[0030]d.若T_lenC〈4且off〈512,則T_lenC用2位二進(jìn)制數(shù)表示,off用9位二進(jìn)制數(shù)表示,再加上2位前綴位,將(off,T_lenC)編碼為00+ΧΧ以及XXXXXXXXX,并存放到c區(qū);
[0031]e.若 T_lenC<4 且 512< = off〈8192,則 T_lenC 用 2 位二進(jìn)制數(shù)表示,off 用 13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)01前綴位,將(off,T_lenC)編碼為01+XX以及XXXXXXXXXXXXX,存放到 c 區(qū);
[0032]f.若 4〈 = T_lenC〈19 且 off〈512,則(T_lenC_4)用 4 位二進(jìn)制數(shù)表示,off 用 9位二進(jìn)制數(shù)表示,再加上3位二進(jìn)制數(shù)前綴位100,將(off,T_lenC)編碼為100+XXXX以及XXXXXXXXX,并將其存放到c區(qū);
[0033]g.若 4〈 = T_lenC〈19 且 512〈 = off〈8192,則(T_lenC_4)用 4 位二進(jìn)制數(shù)表示,off用13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)前綴位11,將(off,T_lenC)編碼為11+XXXX以及XXXXXXXXXXXXX,存放到c區(qū);
[0034]h.若 T_lenC〈15 且 off〉= 8192,則 T_lenC 用 4 位二進(jìn)制數(shù)表示,off 用 16 位二進(jìn)制數(shù)表示,再加上3位二進(jìn)制數(shù)前綴位101,將(off,T_lenC)編碼為101+XXXX以及XXXXXXXXXXXXXXXX,存放到 c 區(qū);
[0035]1.若 T_lenC> = 19 且 off〈512,則 T_lenC 用 16 位二進(jìn)制數(shù)表示,off 用 9 位二進(jìn)制數(shù)表示,再加上3位二進(jìn)制數(shù)前綴位100,將(off,T_lenC)編碼為100+1111以及XXXXXXXXX,存放到c區(qū),同時(shí),將16位二進(jìn)制數(shù)表示的T_lenC的值存放到d區(qū);
[0036]j.若 T_lenC> = 19 且 512〈 = off〈8192,則 T_lenC 用 16 位二進(jìn)制數(shù)表示,off 用13位二進(jìn)制數(shù)表示,再加上2位二進(jìn)制數(shù)前綴位11,將(off,T_lenC)編碼為11+1111以及XXXXXXXXXXXXX,并將其存放到c區(qū),同時(shí),將16位二進(jìn)制數(shù)表示的T_lenC的值存放到d區(qū);
[0037]k.若 T_lenC> = 15 且 off〉= 8192,則 T_lenC 用 16 位二進(jìn)制數(shù)表示,off 用 16位二進(jìn)制數(shù)表示,再加上3位二進(jìn)制數(shù)前綴位101,將(off,T_lenC)編碼為101+1111以及XXXXXXXXXXXXXXXX,存放到c區(qū),同時(shí),將16位二進(jìn)制數(shù)表示的T_lenC的值存放到d區(qū);
[0038]對(duì)所有的三元組(off,T_lenC,lenL)完成編碼以后,形成了 c區(qū)數(shù)據(jù)序列和d區(qū)數(shù)據(jù)序列,c區(qū)和d區(qū)共同構(gòu)成a區(qū);
[0039]完成編碼,執(zhí)行步驟8 ;
[0040]步驟8:
[0041]在a區(qū)頭部生成若干個(gè)標(biāo)志字節(jié),然后將a區(qū)和b區(qū)組合在一起,并且在頭部生成若干的標(biāo)志字節(jié),完成壓縮過(guò)程;
[0042]解壓步驟:
[0043]步驟I)判斷壓縮方法為快速編碼方法壓縮或是緊湊編碼方法,快速編碼方法解壓轉(zhuǎn)至步驟2)執(zhí)行,緊湊編碼方法解壓轉(zhuǎn)至步驟3)執(zhí)行;
[0044]步驟2)快速編碼方法解壓:
[0045]定義三元組(off,lenC,lenL)臨時(shí)區(qū)的單個(gè)三元組表項(xiàng)結(jié)構(gòu)為6字節(jié)結(jié)構(gòu),第I第2字節(jié)為off,第3第4字節(jié)為lenC,第5第6字節(jié)為lenL,整個(gè)臨時(shí)區(qū)由若干個(gè)連續(xù)的三元組表項(xiàng)組成;
[0046]a區(qū)由c區(qū)和d區(qū)數(shù)據(jù)組成,取c區(qū)數(shù)據(jù),解析前綴三元組(a,b,c),根據(jù)a,b,c的值,確定其在d區(qū)對(duì)應(yīng)的(x,y,z)三元組的長(zhǎng)度,并正確解析出x,y,z的值,將x,y,z的值填充到三元組(off,lenC,lenL)的臨時(shí)區(qū)6字節(jié)結(jié)構(gòu)中,直到全部解析完成,將在三元組(off,lenC,lenL)臨時(shí)區(qū)填充若干個(gè)三元組(off,lenC,lenL)6字節(jié)結(jié)構(gòu),形成完整的三元組(off,lenC,lenL) 6字節(jié)結(jié)構(gòu)列表;
[0047]然后,對(duì)于三元組(off,lenC,lenL) 6字節(jié)結(jié)構(gòu)列表中的第二個(gè)分量IenC進(jìn)行修正,令C_lenC = lenC+4,然后把C_lenC填充到IenC的位置,取代IenC的值;
[0048]然后,取第一個(gè)三元組(off,C_lenC,lenL),將b區(qū)原始碼從第一個(gè)原始碼開(kāi)始,復(fù)制IenL的長(zhǎng)度到輸出空間,再根據(jù)off計(jì)算得到復(fù)制碼首字符在輸出空