一、实验目的
1、掌握词典编码的基本原理
2、C/C++/Python等语言编程实现LZW解码器
3、分析编解码算法
二、实验要求
1、首先调试LZW的编码程序,以一个文本文件作为输入,得到输出的LZW编码文件
2、以实验步骤一得到的编码文件作为输入,编写LZW的解码程序。在写解码程序时需要对关键语句加上注释,并说明进行何操作。在实验报告中重点说明当前码字在词典中不存在时应如何处理并解释原因
3、选择至少十种不同格式类型的文件,使用LZW编码器进行压缩得到输出的压缩比特流文件。对各种不同格式的文件进行压缩效率的分析
三、实验原理
1、LZW编码
LZW的编码思想是不断地从字符流中提取新的字符串,通俗地理解为新“词条”,然 后用“代号”也就是码字表示这个“词条”。这样一来,对字符流的编码就变成了用码字去替换字符流,生成码字流,从而达到压缩数据的目的。LZW编码是围绕称为词典的转换表来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输入是字符流,字符流可以是用8位ASCII字符组成的字符串,而输出是用n位(例如12位)表 示的码字流。编码步骤如下:
2、LZW解码
LZW解码算法开始时,译码词典和编码词典相同,包含所有可能的前缀根。解码步骤如下:
- 解码特殊情况:
解码时遇到CW对应字符不在词典中,例如:
在编码时,当aba
加入词典就要立即编码,但编码比解码要先一步进行,所以在解码时,遇到码字259
时,词典中并没有对应字符串,无法解码。
- 如何处理这种情况:
只有头尾字符相同的字符串才会出现解码特殊情况,因此在解码时,将PW
字符串和PW
字符串的第一个字符拼接即可解码,并将其加入词典。
四、代码实现
1、bitio.h头文件
声明实验中用到的函数
/*
* Declaration for bitwise IO
*
* vim: ts=4 sw=4 cindent
*/
#ifndef __BITIO__
#define __BITIO__
#include <stdio.h>
typedef struct{
FILE *fp;
unsigned char mask;
int rack;
}B