專利名稱:一種解壓縮方法、系統(tǒng)和系統(tǒng)制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)數(shù)據(jù)壓縮領(lǐng)域,尤其涉及一種解壓縮方法、系統(tǒng)和系統(tǒng)制作方法。
背景技術(shù):
LZW壓縮算法是一種通用的無損壓縮方法,廣泛應(yīng)用于圖像和文本處理過程中。該壓縮算法是根據(jù)其三個主要的發(fā)明人Lempel、Zif、Welch名字的首字母命名的。LZW壓縮算法的優(yōu)點(diǎn)在于該壓縮算法的自適應(yīng),即無論是壓縮過程還是解壓縮流程除了數(shù)據(jù)流以外不需要額外的數(shù)據(jù);適應(yīng)性廣,即無論是圖像數(shù)據(jù)還是正文數(shù)據(jù)均可采用;對輸入數(shù)據(jù)流的快速適應(yīng)性以及壓縮的速度快。
目前,LZW壓縮算法對應(yīng)的解壓縮流程如圖1所示,包括以下步驟步驟S101,初始化解壓縮環(huán)境,具體包括初始化us(unit size,數(shù)據(jù)單元的位數(shù))、clear碼(清空碼)、eod碼(end of data,結(jié)束碼)和當(dāng)前壓縮碼字的長度len;步驟S102,從數(shù)據(jù)流中讀取len位數(shù)據(jù),即讀取一個碼字code;步驟S103,判斷該碼字是否eod碼,如果是,解壓縮流程結(jié)束,否則,進(jìn)行步驟S104;步驟S104,判斷該碼字是否clear碼,如果是,進(jìn)行步驟S105,否則進(jìn)行步驟S106;步驟S105,初始化字典,具體包括初始化下一個將要生成的字典入口next、當(dāng)前長度編碼的最大碼字max,在初始化字典完成后返回步驟S102;根據(jù)LZW壓縮算法的規(guī)定,壓縮數(shù)據(jù)流第一個出現(xiàn)的碼字一定是clear碼,從而在對壓縮數(shù)據(jù)流進(jìn)行解壓縮之前可以對字典進(jìn)行初始化。在具體實(shí)現(xiàn)時,在步驟S101中定義當(dāng)前壓縮碼字的長度len的工作也可以在讀取到clear碼時進(jìn)行。
步驟S106,判斷該碼字是否已經(jīng)出現(xiàn)在字典中,如果是,進(jìn)行步驟S107,否則進(jìn)行步驟S108;在本步驟中,通過判斷code和next的大小來確定該碼字是否已經(jīng)出現(xiàn)在字典中,如果code小于next,則該碼字已經(jīng)出現(xiàn)在字典中,否則該碼字尚未出現(xiàn)在字典中。
步驟S107,以us位為單位在字典中查找該碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⒉檎业降臄?shù)據(jù)插入到棧中生成該碼字的解壓縮數(shù)據(jù)串,用參數(shù)finchar記錄該數(shù)據(jù)串中最后查找到的數(shù)據(jù),進(jìn)行步驟S109;步驟S108,將參數(shù)finchar記錄的數(shù)據(jù)復(fù)制到該棧的棧底,當(dāng)前finchar記錄的數(shù)據(jù)為在解壓縮相鄰上一個碼字old時最后查找到的數(shù)據(jù),然后在字典中重新查找上一個碼字old對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⒉檎业降臄?shù)據(jù)插入到該棧中生成該碼字的解壓縮數(shù)據(jù)串;步驟S109,將棧中的解壓縮數(shù)據(jù)串轉(zhuǎn)移到輸出緩沖區(qū)中;步驟S110,在字典中增加入口next;步驟111,為下一次解壓縮建立環(huán)境,返回步驟S102。
在上述流程的步驟S108中,在當(dāng)前讀取的碼字code還未出現(xiàn)在字典中時,需要在字典中重新查找上一個碼字old對應(yīng)的解壓縮數(shù)據(jù)串,并將此數(shù)據(jù)串按照查找的順序插入到棧中,可見,雖然棧中當(dāng)前的數(shù)據(jù)串就是old對應(yīng)的解壓縮數(shù)據(jù)串,但是,在對還未出現(xiàn)在字典中的code進(jìn)行處理時,卻沒有利用棧中的當(dāng)前數(shù)據(jù)串,而是重新在字典中查找了old對應(yīng)的數(shù)據(jù)串,工作量較大。
發(fā)明內(nèi)容
本發(fā)明提供一種解壓縮方法、系統(tǒng)和制作方法,用以提高LZW解壓縮的速度。
為了解決上述技術(shù)問題,本發(fā)明提供了一種解壓縮方法,依次讀取待處理碼字并生成對應(yīng)的解壓縮數(shù)據(jù)串;當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,生成所述待處理碼字的解壓縮數(shù)據(jù)串的具體方法為移動所述棧的棧底,將所述棧的棧頂元素復(fù)制到移動后的棧底。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,生成所述待處理碼字的解壓縮數(shù)據(jù)串的具體方法為移動所述隊(duì)列的隊(duì)列尾,將所述隊(duì)列的首元素復(fù)制到移動后的隊(duì)列尾。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
本發(fā)明還提供了一種解壓縮系統(tǒng),所述系統(tǒng)包括用于依次讀取待處理碼字的讀取模塊;用于當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串的第一處理模塊。
進(jìn)一步地,上述系統(tǒng)還可具有以下特點(diǎn)所述系統(tǒng)包括用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串的第二處理模塊。
進(jìn)一步地,上述系統(tǒng)還可具有以下特點(diǎn)所述系統(tǒng)包括用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第一控制模塊。
進(jìn)一步地,上述系統(tǒng)還可具有以下特點(diǎn)所述系統(tǒng)包括用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串的第三處理模塊。
進(jìn)一步地,上述系統(tǒng)還可具有以下特點(diǎn)所述系統(tǒng)包括用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
本發(fā)明還提供了一種解壓縮系統(tǒng)制作方法,包括以下步驟設(shè)置讀取模塊,用于依次讀取待處理碼字;設(shè)置第一處理模塊,用于當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述制作方法還可具有以下特點(diǎn)還設(shè)置第二處理模塊,用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述制作方法還可具有以下特點(diǎn)還設(shè)置第一控制模塊,用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
進(jìn)一步地,上述制作方法還可具有以下特點(diǎn)還設(shè)置第三處理模塊,用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
進(jìn)一步地,上述制作方法還可具有以下特點(diǎn)還設(shè)置第二控制模塊,用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
本發(fā)明有益效果如下在本發(fā)明中,依次讀取待處理碼字并生成對應(yīng)的解壓縮數(shù)據(jù)串;當(dāng)該待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)該待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成該待處理碼字的解壓縮數(shù)據(jù)串,而不用重新在字典中查找了該上一個碼字對應(yīng)的解壓縮數(shù)據(jù)串,減小了生成該待處理碼字的解壓縮數(shù)據(jù)串的工作量,提高了生成該待處理碼字的解壓縮數(shù)據(jù)串的速度。可見,采用本發(fā)明技術(shù)方案,可以提高解壓縮字典中尚未出現(xiàn)的碼字的速度,從而提高LZW解壓縮的整體速度。
圖1為現(xiàn)有技術(shù)中LZW壓縮算法對應(yīng)的解壓縮流程圖;圖2為本發(fā)明實(shí)施例一中LZW壓縮算法對應(yīng)的解壓縮流程圖;圖3為本發(fā)明實(shí)施例二中LZW壓縮算法對應(yīng)的解壓縮流程圖。
具體實(shí)施例方式
本發(fā)明的核心思想是,依次讀取待處理碼字并生成對應(yīng)的解壓縮數(shù)據(jù)串;當(dāng)該待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)該待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成該待處理碼字的解壓縮數(shù)據(jù)串,而不用重新在字典中查找了該上一個碼字對應(yīng)的解壓縮數(shù)據(jù)串,提高解壓縮字典中尚未出現(xiàn)的碼字的速度,從而提高整個解壓縮流程的速度。
下面結(jié)合附圖和實(shí)施例對本發(fā)明作進(jìn)一步地描述。
實(shí)施例一本實(shí)施例中,在LZW壓縮算法對應(yīng)的解壓縮流程中,當(dāng)當(dāng)前讀取的碼字code還未出現(xiàn)在字典中時,利用其相鄰上一個碼字的解壓縮數(shù)據(jù)串,即棧中當(dāng)前的數(shù)據(jù)串,來生成當(dāng)前讀取的碼字code對應(yīng)的解壓縮數(shù)據(jù)串,在具體的實(shí)現(xiàn)中,需要移動棧底,因此,在本實(shí)施例中需要將??臻g擴(kuò)大,例如,現(xiàn)有技術(shù)中需要的最小??臻g為N,則本實(shí)施例中需要的最小??臻g為2×N-1,并將初始棧底指向該??臻g的中央。
本實(shí)施例中,LZW壓縮算法對應(yīng)的解壓縮流程如圖2所示,包括以下步驟步驟S201,初始化解壓縮環(huán)境,具體包括初始化us、clear碼、eod碼和len;本步驟的具體實(shí)現(xiàn)代碼可以如下us=8;//在本實(shí)施例中以us為8位(即一個字節(jié))為例來進(jìn)行說明clear=1<<us;eod=clear+1;len=us+1;步驟S202,從數(shù)據(jù)流中讀取len位數(shù)據(jù),即讀取一個碼字code;本步驟的具體實(shí)現(xiàn)代碼可以如下code=readbits(len);//從數(shù)據(jù)流中讀取len位數(shù)據(jù),即一個碼字,并將其賦//值給code步驟S203,判斷該碼字是否eod碼,如果是,解壓縮流程結(jié)束,否則,進(jìn)行步驟S204;
步驟S204,判斷該碼字是否clear碼,如果是,進(jìn)行步驟S205,否則進(jìn)行步驟S206;步驟S205,初始化字典,具體包括初始化next、max以及棧的棧底,在初始化字典完成后返回步驟S202;本步驟的具體實(shí)現(xiàn)代碼可以如下next=eod;max=1<<len;bottom=stack+size/2;//將棧底指向該??臻g的中央和現(xiàn)有技術(shù)相比,在本步驟中,增加了初始化棧底的內(nèi)容,將初始棧底指向該棧空間的中央。
步驟S206,判斷該碼字是否已經(jīng)出現(xiàn)在字典中,如果是,進(jìn)行步驟S207,否則進(jìn)行步驟S208;在本步驟中,通過判斷code和next的大小來確定該碼字是否已經(jīng)出現(xiàn)在字典中,如果code小于next,則該碼字已經(jīng)出現(xiàn)在字典中,否則該碼字尚未出現(xiàn)在字典中。
步驟S207,以us位為單位在字典中查找該碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⒉檎业降臄?shù)據(jù)插入到該棧中生成該碼字的解壓縮數(shù)據(jù)串,用參數(shù)finchar記錄該數(shù)據(jù)串中最后查找到的數(shù)據(jù),進(jìn)行步驟S209;本步驟的具體實(shí)現(xiàn)代碼可以如下top=lookup(bottom,code);其中l(wèi)ookup的定義為unit*lookup(p,code){finchar=code;while(finchar>clear){*p++=k[finchar]; //k[finchar]表示finchar的后綴碼字,
//‘*p++=k[finchar]’表示將finchar的后//綴碼字插入指針p指向的數(shù)據(jù)單元,然//后移動指針pfinchar=l[finchar]; //l[finchar]表示finchar碼字的前綴碼字}*p=finchar;return p;//返回數(shù)據(jù)串的棧頂元素的指針}步驟S208,在當(dāng)前棧的基礎(chǔ)上移動棧底,將該棧當(dāng)前的棧頂元素復(fù)制到當(dāng)前棧底;本步驟的具體實(shí)現(xiàn)代碼可以如下bottom--;//移動棧底*bottom=finchar;//把棧頂元素復(fù)制到棧底由于該棧中當(dāng)前的數(shù)據(jù)串即為上一個碼字old的解壓縮數(shù)據(jù)串,因此,只需要利用該棧當(dāng)前的數(shù)據(jù)串,移動該棧的棧底并將該棧當(dāng)前的棧頂元素復(fù)制到當(dāng)前棧底,即可得到當(dāng)前需要解壓縮的碼字code的解壓縮數(shù)據(jù)串,而不需要重新在字典中查找了old對應(yīng)的解壓縮數(shù)據(jù)串,減少解壓縮字典中未出現(xiàn)的碼字時的工作量,提高解壓縮字典中未出現(xiàn)的碼字時的速度。
步驟S209,將棧中的數(shù)據(jù)串轉(zhuǎn)移到輸出緩沖區(qū)中;由于如果下一個要解壓縮的碼字是尚未在字典中出現(xiàn)的碼字,則需要利用當(dāng)前棧中的數(shù)據(jù)串來生成下一個要解壓縮的碼字的解壓縮數(shù)據(jù)串,因此,在本步驟中,轉(zhuǎn)移棧中的數(shù)據(jù)串時,不能直接利用指向棧頂?shù)闹羔榯op來轉(zhuǎn)移,要保持top的值不變,而可以利用一個臨時變量p,將top的值賦予p來進(jìn)行數(shù)據(jù)串的轉(zhuǎn)移,因此本步驟的具體實(shí)現(xiàn)代碼可以如下p=top;while(p>=bottom)//從棧頂?shù)綏5籽h(huán)putout(*p--,out);//將數(shù)據(jù)單元復(fù)制到輸出緩沖區(qū)可見,由于在本實(shí)施例中可能需要移動棧底,因此,在該代碼中,從棧頂?shù)綏5椎难h(huán)判斷指針的數(shù)值是否大于等于bottom來實(shí)現(xiàn),該bottom是一個變量,而不是像現(xiàn)有技術(shù)中一樣判斷指針的數(shù)值是否大于stack來實(shí)現(xiàn),該stack是一個固定值。
步驟S210,在字典中增加入口next;本步驟的具體實(shí)現(xiàn)代碼可以如下l[next]=old;//將上一個碼字old賦予next作為前綴碼字k[next]=finchar;//將參數(shù)finchar記錄的數(shù)據(jù)賦予next作為后綴碼字步驟S211,為下一次解壓縮建立環(huán)境,返回步驟S202。
本步驟的具體實(shí)現(xiàn)代碼可以如下if(++next==max){len++; //增加編碼長度max=1<<len;}old=code; //將當(dāng)前讀取的碼字code賦予old,在解壓縮下一個碼字//時作為其相鄰的上一個被解壓縮的碼字在本實(shí)施例中,當(dāng)當(dāng)前讀取的碼字code還未出現(xiàn)在字典中時,不需要在字典中重新查找old對應(yīng)的解壓縮數(shù)據(jù)串來生成code對應(yīng)的解壓縮數(shù)據(jù)串,而僅僅是在old對應(yīng)的解壓縮數(shù)據(jù)串基礎(chǔ)上增加一個數(shù)據(jù)得到code對應(yīng)的解壓縮數(shù)據(jù)串,減少了生成還未出現(xiàn)在字典中的code對應(yīng)的解壓縮數(shù)據(jù)串的工作量,在保持解壓縮結(jié)果和解壓縮處理流程的情況下,有效地提高基于LZW字典壓縮的數(shù)據(jù)流的解壓縮速度。
實(shí)施例二為了使基于LZW字典壓縮的數(shù)據(jù)流的解壓縮速度進(jìn)一步提高,在本實(shí)施例中,在隊(duì)列中生成被解壓縮的碼字對應(yīng)的解壓縮數(shù)據(jù)串,如此解壓縮速度會在實(shí)施例一的基礎(chǔ)上進(jìn)一步提高,尤其是當(dāng)數(shù)據(jù)單元位數(shù)為一個字節(jié)、或者2的冪時。采用本實(shí)施例的技術(shù)方案,將解壓縮數(shù)據(jù)串輸出時倒序的轉(zhuǎn)移過程變成了內(nèi)存的拷貝過程,因此,在16位、32位和64位平臺上解壓縮的速度能得到進(jìn)一步提高。
本實(shí)施例中,LZW壓縮算法對應(yīng)的解壓縮流程如圖3所示,包括以下步驟步驟S301,初始化解壓縮環(huán)境,具體包括初始化us、clear碼、eod碼和len;本步驟的具體實(shí)現(xiàn)代碼可以如下us=8;//在本實(shí)施例中以us為8位(即一個字節(jié))為例來進(jìn)行說明clear=1<<us;eod=clear+1;len=us+1;步驟S302,從數(shù)據(jù)流中讀取len位數(shù)據(jù),即讀取一個碼字code;本步驟的具體實(shí)現(xiàn)代碼可以如下code=readbits(len);//從數(shù)據(jù)流中讀取len位數(shù)據(jù),即一個碼字,并將其賦//值給code步驟S303,判斷該碼字是否eod碼,如果是,解壓縮流程結(jié)束,否則,進(jìn)行步驟S304;步驟S304,判斷該碼字是否clear碼,如果是,進(jìn)行步驟S305,否則進(jìn)行步驟S306;步驟S305,初始化字典,具體包括初始化next、max以及隊(duì)列尾,在初始化字典完成后返回步驟S302;本步驟的具體實(shí)現(xiàn)代碼可以如下next=eod;max=1<<len;tail=queue+size/2;//將隊(duì)列尾移至緩沖區(qū)中間和現(xiàn)有技術(shù)相比,在本步驟中,增加了初始化隊(duì)列尾的內(nèi)容,將隊(duì)列尾移至緩沖區(qū)中間。
步驟S306,判斷該碼字是否已經(jīng)出現(xiàn)在字典中,如果是,進(jìn)行步驟S307,否則進(jìn)行步驟S308;在本步驟中,通過判斷code和next的大小來確定該碼字是否已經(jīng)出現(xiàn)在字典中,如果code小于next,則該碼字已經(jīng)出現(xiàn)在字典中,否則該碼字尚未出現(xiàn)在字典中。
步驟S307,以us位為單位在字典中查找該碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⒉檎业降臄?shù)據(jù)放入隊(duì)列中生成該碼字對應(yīng)的解壓縮數(shù)據(jù)串,用參數(shù)finchar記錄該數(shù)據(jù)串中最后查找到的數(shù)據(jù),進(jìn)行步驟S309;本步驟的具體實(shí)現(xiàn)代碼可以如下head=lookup2(tail,code);其中l(wèi)ookup2的定義為unit*lookup2(p,code){finchar=code;while(finchar>clear){*p--=k[finchar];finchar=l[finchar];}*p=finchar;return p;//返回數(shù)據(jù)串的隊(duì)列頭部元素的指針}步驟S308,在當(dāng)前隊(duì)列的基礎(chǔ)上移動隊(duì)列尾,將隊(duì)列中當(dāng)前的首元素復(fù)制到隊(duì)列尾;本步驟的具體實(shí)現(xiàn)代碼可以如下
tail++;//移動隊(duì)列尾*tail=finchar;//把隊(duì)列首元素復(fù)制到隊(duì)列尾由于隊(duì)列中當(dāng)前的數(shù)據(jù)串即為上一個碼字old對應(yīng)的解壓縮數(shù)據(jù)串,因此,只需要利用隊(duì)列中當(dāng)前的數(shù)據(jù)串,移動隊(duì)列尾并將隊(duì)列當(dāng)前的首元素復(fù)制到當(dāng)前隊(duì)列尾,即可得到當(dāng)前需要解壓縮的碼字code對應(yīng)的解壓縮數(shù)據(jù)串,而不需要重新在字典中查找了old對應(yīng)的解壓縮數(shù)據(jù)串,減少解壓縮字典中未出現(xiàn)的碼字時的工作量,提高解壓縮字典中未出現(xiàn)的碼字時的速度。
步驟S309,將隊(duì)列中的數(shù)據(jù)串以正序的方式轉(zhuǎn)移到輸出緩沖區(qū);由于如果下一個要解壓縮的碼字是尚未在字典中出現(xiàn)的碼字,則需要利用當(dāng)前隊(duì)列中的數(shù)據(jù)串來生成下一個要解壓縮的碼字對應(yīng)的解壓縮數(shù)據(jù)串,因此,在本步驟中,轉(zhuǎn)移隊(duì)列中的數(shù)據(jù)串時,不能直接利用指向隊(duì)列首的指針head來轉(zhuǎn)移,要保持head的值不變,而可以利用一個臨時變量p,將head的值賦予p來進(jìn)行數(shù)據(jù)串的轉(zhuǎn)移,因此本步驟的具體實(shí)現(xiàn)代碼可以如下p=head;while(p<=tail)//從隊(duì)列首到隊(duì)列尾循環(huán)putout(*p++,out);//將數(shù)據(jù)單元復(fù)制到輸出緩沖區(qū)步驟S310,在字典中增加入口next;本步驟的具體實(shí)現(xiàn)代碼可以如下l[next]=old;//將上一個碼字old賦予next作為前綴碼字k[next]=finchar;//將參數(shù)finchar記錄的數(shù)據(jù)賦予next作為后綴碼字步驟S311,為下一次解壓縮建立環(huán)境,返回步驟S302。
本步驟的具體實(shí)現(xiàn)代碼可以如下if(++next==max){len++; //增加編碼長度max=1<<len;
}old=code; //將當(dāng)前讀取的碼字code賦予old,在解壓縮下一個碼字//時作為其相鄰的上一個被解壓縮的碼字在本實(shí)施例中,當(dāng)當(dāng)前讀取的碼字code還未出現(xiàn)在字典中時,同樣不需要在字典中重新查找old對應(yīng)的解壓縮數(shù)據(jù)串來生成code對應(yīng)的解壓縮數(shù)據(jù)串,而僅僅是在old對應(yīng)的解壓縮數(shù)據(jù)串基礎(chǔ)上增加一個數(shù)據(jù)得到code對應(yīng)的解壓縮數(shù)據(jù)串,減少了生成還未出現(xiàn)在字典中的code對應(yīng)的解壓縮數(shù)據(jù)串的工作量,在保持解壓縮結(jié)果和解壓縮處理流程的情況下,有效地提高基于LZW字典壓縮的數(shù)據(jù)流的解壓縮速度。并且,采用本實(shí)施例技術(shù)方案,將數(shù)據(jù)串輸出時倒序的轉(zhuǎn)移過程變成了內(nèi)存的拷貝過程,可以進(jìn)行批量復(fù)制,因此,可以進(jìn)一步地提高LZW的解壓縮速度。
本發(fā)明的一個實(shí)施例中的解壓縮系統(tǒng)包括用于依次讀取待處理碼字的讀取模塊;用于當(dāng)該待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)該待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成該待處理碼字的解壓縮數(shù)據(jù)串的第一處理模塊。
該解壓縮系統(tǒng)可以包括用于當(dāng)該待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找該待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)?shù)據(jù)壓入棧來生成該待處理碼字的解壓縮數(shù)據(jù)串的第二處理模塊。
該解壓縮系統(tǒng)可以包括用于在生成該待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第一控制模塊。
該解壓縮系統(tǒng)可以包括用于當(dāng)該待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找該待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)?shù)據(jù)放入隊(duì)列來生成該待處理碼字的解壓縮數(shù)據(jù)串的第三處理模塊。
該解壓縮系統(tǒng)可以包括用于在生成該待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
本發(fā)明的一個實(shí)施例中的解壓縮系統(tǒng)制作方法,包括以下步驟設(shè)置讀取模塊,用于依次讀取待處理碼字;設(shè)置第一處理模塊,用于當(dāng)該待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)該待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成該待處理碼字的解壓縮數(shù)據(jù)串。
還可以設(shè)置第二處理模塊,用于當(dāng)該待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找該待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)?shù)據(jù)壓入棧來生成該待處理碼字的解壓縮數(shù)據(jù)串。
還可以設(shè)置第一控制模塊,用于在生成該待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
還可以設(shè)置第三處理模塊,用于當(dāng)該待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找該待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)?shù)據(jù)放入隊(duì)列來生成該待處理碼字的解壓縮數(shù)據(jù)串。
還可以設(shè)置第二控制模塊,用于在生成該待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種解壓縮方法,依次讀取待處理碼字并生成對應(yīng)的解壓縮數(shù)據(jù)串;其特征在于,當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串。
2.如權(quán)利要求1所述的方法,其特征在于,當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
3.如權(quán)利要求2所述的方法,其特征在于,當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,生成所述待處理碼字的解壓縮數(shù)據(jù)串的具體方法為移動所述棧的棧底,將所述棧的棧頂元素復(fù)制到移動后的棧底。
4.如權(quán)利要求2或3所述的方法,其特征在于,在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
5.如權(quán)利要求1所述的方法,其特征在于,當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
6.如權(quán)利要求5所述的方法,其特征在于,當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,生成所述待處理碼字的解壓縮數(shù)據(jù)串的具體方法為移動所述隊(duì)列的隊(duì)列尾,將所述隊(duì)列的首元素復(fù)制到移動后的隊(duì)列尾。
7.如權(quán)利要求5或6所述的方法,其特征在于,在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
8.一種解壓縮系統(tǒng),其特征在于,所述系統(tǒng)包括用于依次讀取待處理碼字的讀取模塊;用于當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串的第一處理模塊。
9.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述系統(tǒng)包括用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串的第二處理模塊。
10.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述系統(tǒng)包括用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第一控制模塊。
11.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述系統(tǒng)包括用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串的第三處理模塊。
12.如權(quán)利要求11所述的系統(tǒng),其特征在于,所述系統(tǒng)包括用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
13.一種解壓縮系統(tǒng)制作方法,其特征在于,包括以下步驟設(shè)置讀取模塊,用于依次讀取待處理碼字;設(shè)置第一處理模塊,用于當(dāng)所述待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)所述待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成所述待處理碼字的解壓縮數(shù)據(jù)串。
14.如權(quán)利要求13所述的制作方法,其特征在于,還設(shè)置第二處理模塊,用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找的順序?qū)⑺鰯?shù)據(jù)壓入棧來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
15.如權(quán)利要求14所述的制作方法,其特征在于,還設(shè)置第一控制模塊,用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,倒序轉(zhuǎn)移所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口。
16.如權(quán)利要求13所述的制作方法,其特征在于,還設(shè)置第三處理模塊,用于當(dāng)所述待處理碼字是字典中已經(jīng)出現(xiàn)的且非清空碼和結(jié)束碼的碼字時,在字典中查找所述待處理碼字對應(yīng)的數(shù)據(jù),并按照查找順序的倒序?qū)⑺鰯?shù)據(jù)放入隊(duì)列來生成所述待處理碼字的解壓縮數(shù)據(jù)串。
17.如權(quán)利要求16所述的制作方法,其特征在于,還設(shè)置第二控制模塊,用于在生成所述待處理碼字的解壓縮數(shù)據(jù)串后,復(fù)制所述數(shù)據(jù)串到輸出緩沖區(qū),并在字典中增加新入口的第二控制模塊。
全文摘要
本發(fā)明涉及計算機(jī)數(shù)據(jù)壓縮領(lǐng)域,尤其涉及一種解壓縮方法、系統(tǒng)和系統(tǒng)制作方法,用以提高LZW解壓縮的速度。在本發(fā)明中,依次讀取待處理碼字并生成對應(yīng)的解壓縮數(shù)據(jù)串;當(dāng)該待處理碼字是字典中尚未出現(xiàn)的碼字時,根據(jù)該待處理碼字的相鄰上一個碼字的解壓縮數(shù)據(jù)串,生成該待處理碼字的解壓縮數(shù)據(jù)串。采用本發(fā)明技術(shù)方案,可以提高解壓縮字典中尚未出現(xiàn)的碼字的速度,從而提高LZW解壓縮的整體速度。
文檔編號H04N7/26GK101031079SQ200710065439
公開日2007年9月5日 申請日期2007年4月13日 優(yōu)先權(quán)日2007年4月13日
發(fā)明者王劍 申請人:北京大學(xué), 北京北大方正電子有限公司, 北大方正集團(tuán)有限公司