LZW压缩和解压.doc

LZW压缩和解压.doc

ID:48918153

大小:59.00 KB

页数:16页

时间:2020-02-06

LZW压缩和解压.doc_第1页
LZW压缩和解压.doc_第2页
LZW压缩和解压.doc_第3页
LZW压缩和解压.doc_第4页
LZW压缩和解压.doc_第5页
资源描述:

《LZW压缩和解压.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、......LZW压缩和解压黄陂一中盘龙校区张兴才LZW压缩是由Lemple、Zip和Welch共同创造,用他们的名字命名的压缩方法。下面结合C语言的实现方法,介绍LZW压缩和解压的原理。一、码表被压缩的字符系列称为数据流,压缩后的代码称为编码流,将数据流压缩成编码流要依据码表。什么是码表?我们先看看码表的结构和初始化吧。typedefstruct{charused;UINTprev;//typedefUINTunsignedintBYTEc;}ENTRY;voidInitTable(){inti;for(i=0;i<4096;i++){string_t

2、ab[i].used=FALSE;//#defineFALSE0string_tab[i].prev=NO_PREV;//#defineNO_PREV0xFFFF表示没有前缀string_tab[i].c=0;for(i=0;i<258;i++){string_tab[i].used=TRUE;//#defineTRUE!FALSE.专业专注.......string_tab[i].c=i;}}从上面的代码可知,码表共有4096行,每行有3列。used表示该行是否被使用,使用了其值为TRUE,否则为FALSE。prev表示前缀,主要存储的是该码表的索引值

3、(行号),用以指示该表的不同行,取值范围是0——4095。c表示后缀,存储一个字符。该码表的0——257行的prev域被初始化,其中的值表示的意义是:0—255用来表示单个字符,256表示开始新的码表,257表示压缩结束。二、压缩过程以下程序段将infp中的字符系列压缩到outfp中。putcode(outfp,CC);//outfp是存储编码流的文件,CC的值为256,表示开始新的码表,outfp是存放编码流的文件,以上函数表示将码表开始代码放在outfp文件的开始位置InitTable();c=readc(infp);//从输入文件读取一个字符,in

4、fp表示输入文件,c是后缀变量prevcode=QueryTable(NO_PREV,c);//在码表中查询前缀为“NO_PREV”,后缀为“c”(即刚刚读入的字符)的行,并将行号赋给前缀变量prevcode,其实相当于prevcode=c;++total;while(UEOF!=(c=readc(infp)))//UEOF为文件结束标志{++total;if(NOT_FIND!=(localcode=QueryTable(prevcode,c)))//NOT_FIND表示在码表中查询指定的前缀和后缀对,没有找到.专业专注.......{prevcode

5、=localcode;//找到指定的前缀后缀对后,将找到行的行号赋给前缀变量,接着从输入文件读入下一个字符作为后缀,进行下一轮的查询continue;}putcode(outfp,prevcode);//指定的前缀和后缀对没有找到,则将前缀变量prevcode的值输出到存储编码流的输出文件outfp中if(count)//count为码表中空白行的行数{UpdateTable(prevcode,c);//将指定的前缀和后缀分别填入码表的第一个空白行的相应位置--count;//码表的空白行减1}if(count==0)//如果码表没有空白行了,则重新建一

6、个码表,并在编码流中放入代码CC(256),表示开始新的码表。{count=4096-258;currentpos=258;InitTable();putcode(outfp,CC);//CC表示开始新的码表}prevcode=QueryTable(NO_PREV,c);//其实是将c的值赋给prevcode.专业专注.......}putcode(outfp,prevcode);putcode(outfp,CEND);//CEND是编码压缩结束标志if(tempcode!=EMPTY)outputbuf[oupindex++]=(tempcode&0x

7、0F0);//关键!!!!flushout(outfp);//将输出缓存区剩余的编码写入文件中return0;}LZW压缩算法流程是是是否初始化码表读入数据流中第一个字符到前缀变量prevcode中读入一个字符到后缀变量c中文件结束吗?在码表中查找指定的前缀后缀对找到吗?将前缀变量的值写入编码流中码表空否?将前缀变量和后缀变量的值写入码表的第一个空白行重新初始化码表,并将CC的值放入编码流中将后缀变量的值赋给前缀变量把最后一个字符即prevcode变量中的字符写入编码流中结束开始否否将找到行的行号赋给前缀变量.专业专注.......三、.解压过程这是LZ

8、W解码的主要代码:prevcode=0;while((prevcode=getc

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。