版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、用C+實(shí)現(xiàn)數(shù)據(jù)無損壓縮、解壓(使用LZW算法)LZW壓縮算法由Lemple-Ziv-Welch三人共同創(chuàng)造,用他們的名字命名。LZW就是通過建立一個(gè)字符串表,用較短的代碼來表示較長的字符串來實(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)為LZW很適用于嵌入式系統(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算法比較簡單,我是按照這本書上寫的算法來編程的: (124.6 KB2009-1-5 11:57 (123.14 KB2009-1-5 11:57以下是源代碼: 復(fù)制內(nèi)容到剪貼板 代碼:class LZWCoder private: struct TStr
3、 char *string; unsigned int len; TStr StrTable4097; unsigned int ItemPt;
4、 unsigned int BytePt; unsigned char BitPt; unsigned char Bit8; unsigned char Bits; unsigned int OutBytes;
5、; void InitStrTable(; void CopyStr(TStr *d, TStr s; void StrJoinChar(TStr *s, char c; unsigned int InStrTable(TStr s; void AddTableEntry(TStr s
6、; void WriteCode(char *dest, unsigned int b; unsigned int GetNextCode(char *src; void StrFromCode(TStr *s, unsigned int c; void WriteString(char *de
7、st, TStr s; public: unsigned int Encode(char *src, unsigned int len, char *dest; unsigned int Decode(char *src, unsigned int *len, char *dest; LZWCoder(;
8、 LZWCoder(; ; void LZWCoder:InitStrTable( unsigned int i; for(i = 0; i < 256; i + StrTablei.string = (char *rea
9、lloc(StrTablei.string, 1; StrTablei.string0 = i; StrTablei.len = 1; StrTable256.string = NU
10、LL; StrTable256.len = 0; StrTable257.string = NULL; StrTable257.len = 0; ItemPt = 257; Bits = 9; void LZWCoder
11、:CopyStr(TStr *d, TStr s unsigned int i; d->string = (char *realloc(d->string, s.len; for(i = 0; i < s.len; i +
12、 d->stringi = s.stringi; d->len = s.len; void LZWCoder:StrJoinChar(TStr *s, char c s->string = (char *realloc(s->string, s->len + 1; s->strings->len + = c; unsigned
13、int LZWCoder:InStrTable(TStr s unsigned int i,j; bool b; for(i = 0; i <= ItemPt; i +
14、 if(StrTablei.len = s.len b = true;
15、60; for(j = 0; j < s.len; j + if(StrTablei.stringj != s.stringj &
16、#160; b = false;
17、60; break;
18、160; if(b return i; return 65535; void LZWCoder:AddTableEntry(TStr s
19、0; CopyStr(&StrTable+ItemPt, s; void LZWCoder:WriteCode(char *dest, unsigned int b unsigned char i; for(i = 0; i < Bits; i+
20、0; BitBitPt + = (b & (1 << (Bits - i - 1 != 0; if(BitPt = 8
21、 BitPt = 0; destBytePt + = (Bit0 << 7
22、60; + (Bit1 << 6 + (Bit2 << 5
23、60; + (Bit3 << 4
24、0; + (Bit4 << 3 + (Bit5 << 2
25、0; + (Bit6 << 1 + Bit7;
26、160; unsigned int LZWCoder:GetNextCode(char *src unsigned char i; unsigned int c = 0; for(i = 0; i &l
27、t; Bits; i + c = (c << 1 + (srcBytePt & (1 << (8 - (BitPt + - 1 != 0; if(BitPt = 8
28、0; BitPt = 0; BytePt +;
29、160; return c; void LZWCoder:StrFromCode(TStr *s, unsigned int c CopyStr(s, StrTablec; void LZWCoder:WriteString(char *dest, TStr s &
30、#160; 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 O
31、mega, t; char k; unsigned int i; unsigned int p; BytePt = 0; BitPt = 0;
32、InitStrTable(; WriteCode(dest, 256; Omega.string = NULL; Omega.len = 0; t.string = NULL; t.len = 0;
33、60; for(i = 0; i < len; i + k = srci; CopyStr(&t, Omega;
34、160; StrJoinChar(&t, k; if(InStrTable(t != 65535 CopyStr(&Omega, t; &
35、#160; else WriteCode(dest, InStrTable(Omega;
36、 AddTableEntry(t; switch(ItemPt
37、160; case 512: Bits = 10; break; cas
38、e 1024: Bits = 11; break; case 2048: Bits = 12; break;
39、; case 4096: WriteCode(dest, 256; InitStrTable(; Omega
40、.string = (char *realloc(Omega.string, 1; Omega.string0 = k; Omega.len = 1;
41、60; WriteCode(dest, InStrTable(Omega; WriteCode(dest, 257; Bits = 7;
42、 WriteCode(dest, 0; free(Omega.string; free(t.string; return BytePt; unsigned int LZWCoder:Decode(char *src, unsigned int *len, char *dest unsi
43、gned int code, oldcode; TStr t, s; BytePt = 0; BitPt = 0; OutBytes = 0; t.string = NULL; &
44、#160; t.len = 0; s.string = NULL; s.len = 0; InitStrTable(; while(code = GetNextCode(src != 257
45、160; if(code = 256 InitStrTable(;
46、0; code = GetNextCode(src; if(code = 257 break;
47、 StrFromCode(&s, code; WriteString(dest, s; oldcode = code;
48、160; else if
49、(code <= ItemPt StrFromCode(&s, code; &
50、#160; WriteString(dest, s; Str
51、FromCode(&t, oldcode; StrJoinChar(&t, s.string0;
52、60; AddTableEntry(t; switch(ItemPt &
53、#160; case 511: Bits = 10; break;
54、 case 1023: Bits = 11; break;
55、60; case 2047: Bits = 12; break;
56、 oldcode = code; else
57、 StrFromCode(&s, oldcode;
58、0; StrJoinChar(&s, s.string0; WriteString(dest, s;
59、 AddTableEntry(s; switch(ItemPt
60、; case 511: Bits = 10; break;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度草牧場承包經(jīng)營權(quán)租賃與農(nóng)業(yè)保險(xiǎn)聯(lián)動(dòng)合同3篇
- 二零二五版集裝箱租賃及售后服務(wù)合同樣本3篇
- 2025年度數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)園區(qū)建設(shè)合同3篇
- 2025年移動(dòng)辦公小程序定制開發(fā)與企業(yè)管理服務(wù)合同2篇
- 2024版成都市存量房屋買賣合同實(shí)施條例
- 二零二五版智能家居定制家具采購與售后保障合同3篇
- 2025年度餐飲行業(yè)食品安全風(fēng)險(xiǎn)評(píng)估合同21篇
- 二零二五河南事業(yè)單位100人招聘合同范本解讀與使用指南3篇
- 2024起重機(jī)械進(jìn)出口貿(mào)易合同規(guī)范范本3篇
- 二零二五白酒定制酒生產(chǎn)與銷售合作合同3篇
- 春節(jié)英語介紹SpringFestival(課件)新思維小學(xué)英語5A
- 進(jìn)度控制流程圖
- 2023年江蘇省南京市中考化學(xué)真題
- 【閱讀提升】部編版語文五年級(jí)下冊(cè)第四單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 供電副所長述職報(bào)告
- 現(xiàn)在完成時(shí)練習(xí)(短暫性動(dòng)詞與延續(xù)性動(dòng)詞的轉(zhuǎn)換)
- 產(chǎn)品質(zhì)量監(jiān)控方案
- 物業(yè)總經(jīng)理述職報(bào)告
- 新起點(diǎn),新發(fā)展心得體會(huì)
- 深圳大學(xué)學(xué)校簡介課件
- 校園欺凌問題成因及對(duì)策分析研究論文
評(píng)論
0/150
提交評(píng)論