实验内容和原理
1. LZW简介
LZW压缩算法由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它采用了一种先进的串表
压缩,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只存贮数字,则不
存贮串,从而使图象文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解压缩的过
程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。
LZW算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数
字来表示,这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字
符串再次出现时,即可用表示它的数字来代替,并将这个数字存入文件中。压缩完成后将串表丢
弃。如"print" 字符串,如果在压缩时用266表示,只要再次出现,均用266表示,并将"print"字符串
存入串表中,在图象解码时遇到数字266,即可从串表中查出266所代表的字符串"print",在解压缩
时,串表可以根据压缩数据重新生成。
2.编码算法实现流程图
3.代码分析
void LZWEncode(FILE* fp, BITFILE* bf) {
int character;// 当前字符C
int string_code;// 当前前缀P
int index;// 词典中的索引
unsigned long file_length;
fseek(fp, 0, SEEK_END);// 找到输入文件指针的位置
file_length = ftell(fp);
fseek(fp, 0, SEEK_SET);
BitsOutput(bf, file_length, 4 * 8);
// 1.初始化词典,前缀P初始化为空
InitDictionary();
string_code = -1;
// 2.当前字符C=字符流fp的下一个字符
while (EOF != (character = fgetc(fp))) {
// 3.查找P+C的代号
index = InDictionary(character, string_code);
if (0 <= index) { // string+character in dictionary
string_code = index;//更新前缀P=P+C
}
else { // string+