用C++實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW算法_第1頁
用C++實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW算法_第2頁
用C++實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW算法_第3頁
用C++實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW算法_第4頁
用C++實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW算法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、用C+以現(xiàn)數(shù)據(jù)無損壓縮、解壓使用LZW原法LZW壓縮算法由Lemple-Ziv-Welch三人共同創(chuàng)造,用他們的名字命名。LZW就是通過建立一個(gè)字符串表,用較短的代碼來表示較長(zhǎng)的字符串來實(shí)現(xiàn)壓縮。LZW壓縮算法是Unisys的專利,有效期到2003年,所以對(duì)它的使用是有限制的。字符串和編碼的對(duì)應(yīng)關(guān)系是在壓縮過程中動(dòng)態(tài)生成的,并且隱含在壓縮數(shù)據(jù)中,解壓的時(shí)候根據(jù)表來進(jìn)行恢復(fù),算是一種無損壓縮。個(gè)人認(rèn)為L(zhǎng)ZW適用于嵌入式系統(tǒng)上。因?yàn)椋?、壓縮和解壓速度比擬快,尤其是解壓速度;2、占用資源少;3、壓縮比也比擬理想;4、適用于文本和圖像等出現(xiàn)連續(xù)重復(fù)字節(jié)串的數(shù)據(jù)流。LZW算法有一點(diǎn)比擬特別,就是壓縮過

2、程中產(chǎn)生的字符串對(duì)應(yīng)表,不需要保存到壓縮數(shù)據(jù)中,因?yàn)檫@個(gè)表在解壓過程中能自動(dòng)生成回來。LZW算法比擬簡(jiǎn)單我是按照這本書上寫的算法來編程的00XH1】1如1|iXWOOOilt. j, I W】1W5 WXg】iiN“ ,swoumi11WWXJloiixn., 網(wǎng) 網(wǎng)J叫SHWMM)OIO|irr-OCOOjO|0jn|OOODamoihn.rWXriMtJiOlji|jXWXXIJJWlijnwwooiioopir_岫(KXKHJQOOZ Z 舶f碼嘶像以色眺|l樓成翊J I Pz j南n I枚爆的假設(shè)粉鏢嶇代的Hf * .畀封摩胞設(shè)ffJHIE單.英國(guó)的Wdch料此技木實(shí)用化 廊在Hiil

3、丈本w程律欲犀的堀掛術(shù)中朝I + MJfVhW化漸的散拆必湘一t快此,也 娜也中,LZW力式的J間節(jié)如H*攏學(xué)的卜WKttX它亦式要少.例WlHnHnmn塢時(shí). 蛾行K蜩姓照, 而L7W萬式的史耕或場(chǎng)就 用反心血 涎利圖會(huì)的艾件仆H勺在初 5 的Vt M中,諂如姓名,地也叫此,正叢l/Wg 的敦昵壓蝴訪帷同責(zé)氏白 融寫入的比率為-1 | J. -ZW宵式壓蛔日 膨的比率 g 您便尹頗盤W如七函亍收釁碼時(shí),骨先將諫她的敷掘外成莎個(gè)條 依也機(jī)器的內(nèi)序加,撤&包含8K存中,旦乂明徒近虻化的日謝比.段 L 個(gè)轉(zhuǎn)挨類或孕傘表,它將村人字符映 個(gè)利財(cái)于*個(gè)條紋邯不何, 篇W*血大小的茜3汶部陀涅鄙

4、在lLZW#法最大代碼長(zhǎng)度為12位.這為解IH崩過IM喊自創(chuàng)IELZW體芯的編碼過RlFHik|JrSlnngl -ihlrCWE項(xiàng)mlrnf n n tin- npl* Omi (nr rmhdmMwrr in tinMHU卜;-iITINcxrhlr :ft ft * Ki v. YR 41 r* It Vi I ll-l tl -h . TT- M rl K ( ( J 1AdiilpblrFmij in Kh n Kt1-循蝦w /WHh i .1( .b T. inHrnirf ll ,Wrilri KnH Klnlfirinn I n I 法中W用的函或儻明加h lhiiJinhx

5、eStrinxTflbkCJ卅始化.訂審費(fèi)它包;可低的懶itf rw以下是源代碼:復(fù)制內(nèi)容到剪貼板(代碼:class LZWCoder(private:struct TStr(char *string;unsigned int len;TStr StrTable4097;unsigned int ItemPt;unsigned int BytePt;unsigned char BitPt;unsigned char Bit8;unsigned char Bits;unsigned int OutBytes;void InitStrTable();void CopyStr(TStr *d, TS

6、tr s);void StrJoinChar(TStr *s, char c);unsigned int InStrTable(TStr s);void AddTableEntry(TStr s);void WriteCode(char *dest, unsigned int b);unsigned int GetNextCode(char *src);void StrFromCode(TStr *s, unsigned int c);void WriteString(char *dest, TStr s);public:unsigned int Encode(char *src, unsig

7、ned int len, char *dest);unsigned int Decode(char *src, unsigned int *len, char *dest);LZWCoder();LZWCoder();void LZWCoder:InitStrTable()unsigned int i;for(i = 0; i string = (char *)realloc(d-string, s.len);for(i = 0; i stringi = s.stringi;d-len = s.len;void LZWCoder:StrJoinChar(TStr *s, char c)(s-s

8、tring = (char *)realloc(s-string, s-len + 1);s-strings-len + = c;unsigned int LZWCoder:InStrTable(TStr s)(unsigned int i,j;bool b;for(i = 0; i = ItemPt; i +)if(StrTablei.len = s.len)b = true;for(j = 0; j s.len; j +)if(StrTablei.stringj != s.stringj)(b = false;break;if(b) return i;return 65535;void L

9、ZWCoder:AddTableEntry(TStr s)(CopyStr(&StrTable+ItemPt, s);void LZWCoder:WriteCode(char *dest, unsigned int b)(unsigned char i;for(i = 0; i Bits; i+)(BitBitPt + = (b & (1 (Bits - i - 1) != 0;if(BitPt = 8)(BitPt = 0;destBytePt + = (Bit0 7)+ (Bit1 6)+ (Bit2 5)+ (Bit3 4)+ (Bit4 3)+ (Bit5 2)+ (B

10、it6 1)+ Bit7;)unsigned int LZWCoder:GetNextCode(char *src)(unsigned char i;unsigned int c = 0;for(i = 0; i Bits; i +)(c = (c 1) + (srcBytePt & (1 (8 - (BitPt +) - 1) != 0);if(BitPt = 8)(BitPt = 0;BytePt +;)return c;)void LZWCoder:StrFromCode(TStr *s, unsigned int c)(CopyStr(s, StrTablec);)void L

11、ZWCoder:WriteString(char *dest, TStr s)(unsigned int i;for(i = 0; i s.len; i+)destOutBytes + = s.stringi;)unsigned int LZWCoder:Encode(char *src, unsigned int len, char *dest)(TStr Omega, t;char k;unsigned int i;unsigned int p;BytePt = 0;BitPt = 0;InitStrTable();WriteCode(dest, 256);Omega.string = N

12、ULL;Omega.len = 0;t.string = NULL;t.len = 0;for(i = 0; i len; i +)k = srci;CopyStr(&t, Omega);StrJoinChar(&t, k);if(InStrTable(t) != 65535)CopyStr(&Omega, t);elseWriteCode(dest, InStrTable(Omega);AddTableEntry(t);switch(ItemPt)case 512: Bits = 10; break;case 1024: Bits = 11; break;case 2

13、048: Bits = 12; break;case 4096: WriteCode(dest, 256); InitStrTable();Omega.string = (char *)realloc(Omega.string, 1);Omega.string0 = k;Omega.len = 1;WriteCode(dest, InStrTable(Omega);WriteCode(dest, 257);Bits = 7;WriteCode(dest, 0);free(Omega.string);free(t.string);return BytePt;)unsigned int LZWCo

14、der:Decode(char *src, unsigned int *len, char *dest)unsigned int code, oldcode;TStr t, s;BytePt = 0;BitPt = 0;OutBytes = 0;t.string = NULL;t.len = 0;s.string = NULL;s.len = 0;InitStrTable();while(code = GetNextCode(src) != 257)if(code = 256)InitStrTable();code = GetNextCode(src);if(code = 257) break

15、;StrFromCode(&s, code);WriteString(dest, s);oldcode = code;)elseif(code = ItemPt)StrFromCode(&s, code);WriteString(dest, s);StrFromCode(&t, oldcode);StrJoinChar(&t, s.string0);AddTableEntry(t);switch(ItemPt)case 511: Bits = 10; break;case 1023: Bits = 11; break;case 2047: Bits = 12;

16、break;oldcode = code;elseStrFromCode(&s, oldcode);StrJoinChar(&s, s.string0);WriteString(dest, s);AddTableEntry(s);switch(ItemPt)case 511: Bits = 10; break;case 1023: Bits = 11; break;case 2047: Bits = 12; break;oldcode = code;free(t.string);free(s.string);*len = BytePt + (BitPt != 0);return OutBytes;LZWCoder:LZWCoder()unsigned int i;for(i = 0; i 4097; i +)(StrTablei.string = NULL;StrTablei.len = 0;)LZWCoder:LZWCoder()(unsigned int i;for(i = 0; i Encode(char

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論