LZW编码
LZW编码是从输入的字符流中提取词条,创建词典,用码字来表示词条。LZW围绕词典转换表完成,LZW编码器通过管理词典完成输入和输出间的转换,输入是字符流,输出是n位表示的码字流。解码端输入码字流,边解码边建立词典,得到输出字符流。
编码原理
首先初始化词典,然后顺序从待压缩文件中读入字符并按照上述算法执行编码,最后将编得码字流输出到文件中。
解码原理
LZW解码算法首先初始化词典,然后顺序从压缩文件中读入码字,并按照上述算法执行解码,最后将解得的字符串输出至文件中。
代码分析
- 定义词典树
#define MAX_CODE 65535 //词典中最多的词典数目 struct { //词典树 int suffix; //当前字符的尾缀字符 int parent, firstchild, nextsibling; //分别表示当前节点对应的母节点、第一个孩子节点、下一个兄弟节点 } dictionary[MAX_CODE+1]; int next_code; int d_stack[MAX_CODE]; // stack for decoding a phrase,用来存储解码后的短语
- 初始化词典树
void InitDictionary( void){ //初始化词典 int i; for( i=0; i<256; i++){ //单个字符写入词典,也就是词典树的第一层 dictionary[i].suffix = i; //尾缀字符 dictionary[i].parent = -1; //母节点