1.实验项目名称
LZW 编解码算法实现与分析
2.实验目的
掌握词典编码的基本原理,用C/C++/Python等语言编程实现LZW解码器并分析编解码算
法。
3.什么是LZW编解码算法与它的原理
3.1 LZW编解码算法介绍
摘自维基百科:
LZW算法(Lempel-Ziv-Welch),是以色列科学家亚伯拉罕·蓝波(Lempel)、杰可布·立夫(Ziv)与美国学者泰瑞·卫曲(Welch)共同提出的一种无损数据压缩算法。它在1984年由泰瑞·卫曲改良亚伯拉罕·蓝与杰可布·立夫在1978年发表的LZ78的版本而来(主要是基于Lampel、Ziv的压缩概念,设计出一套具有可逆推的逻辑程序)。
3.2 LZW编解码算法原理
3.2.1 编码流程图及为了便于理解和期末复习举实例说明
假如要给“abbababac”编码,初始化词典如下:
第一步,P=空,C=“a”,P+C=“a”,经判断“a”在词典中,所以P=“a”,接着C=“b”,P+C=“ab”,经判断“ab”不在词典中,所以输出,把“ab”写入词典里,然后P=“b”,读下一个字符“b”并令C=“b”…以此类推,当编到P=“a”,C="b"时,如图,词典里已经有了“ab”:
所以经判断后P=“ab”,读下一个字符“a”,P+C就为“aba”,经判断就把“aba”写到词典里,之后P=“a”,读下一个字符“b”,P+C就为“ab”,经判断后P=“ab”,读下一个字符C=“a”,经判断后P=“aba”,C=“c”,经判断就把“abac”写到词典里
3.2.2 解码流程图及举实例说明(重点说明当前码字在词典中不存在的情形)
假如要给“97 98 98 256 259 99”解码,初始化词典如下:
第一次循环CW=“97”,输出“a”到码字流中后令PW=“97”,CW=“98”,经判断string.CW(此处即为“b”)在词典中,所以输出“b”,之后P=“a”,C=“b”,把P+C=“ab”写到词典中,第二次循环PW=“98”,CW=“98”,经判断string.CW(此处即为“b”)在词典中,所以输出“b”,之后P=“b”,C=“b”,把P+C=“bb”写到词典中,第三次循环执行PW=“98”,CW=“256”时,词典如下:
经判断输出“ab”,之后P=“b”,C=“a”(取“ab”的第一个字符),把P+C=“ba”写到词典中:
第四次循环PW=“256”,CW=“259”,经判断经判断string.CW不在词典中,所以P=“ab”,此时按照流程图,应该取字典里序号为259对应字符的第一个字符,但是字典里序号为259的String是空的,怎么办?
按照老师的解释,这是由于在编码时,新的“P+C”刚被创建,下一个“P”就需要使用它造成的,新创建的“P+C”的尾缀是新创建的“P+C”的首字符“,所以序号为259的String为“aba”,输出“aba”
第五次循环PW=“259”,CW=“99”,经判断string.cw在词典中,所以输出“c”,然后全部解码结束。
4.用C语言实现该算法
4.1 实验关键代码及其注释
bitio.c:
BITFILE *OpenBitFileInput( char *filename){
//打开要读入的文件
BITFILE *bf;
bf = (BITFILE *)malloc( sizeof(BITFILE));
if( NULL == bf) return NULL;
if( NULL == filename) bf->fp = stdin;
else bf->fp = fopen( filename, "rb");
if( NULL == bf->fp) return NULL;
bf->mask = 0x80;
bf->rack = 0;
return bf;
}
BITFILE *OpenBitFileOutput( char *filename){
//创建要写出的文件
BITFILE *bf;
bf = (BITFILE *)malloc( sizeof(BITFILE));
if( NULL == bf) return NULL;
if( NULL == filename) bf->fp = stdout;
else bf->fp = fopen( filename, "wb");
if( NULL == bf->fp) return NULL;
bf->mask = 0x80;
bf->rack = 0;
return bf;
}
void CloseBitFileInput( BITFILE *bf){
//关闭读入文件比特流
fclose( bf->fp);
free( bf);
}
void CloseBitFileOutput( BITFILE *bf){
//输出剩余比特数据后关闭比特流
if( 0x80 != bf->mask) fputc