LZW编解码算法的实现与分析

本文介绍了LZW压缩算法的原理和实现过程,包括编码和解码的流程,以及词典数据结构的分析。LZW算法通过创建字符串表,用数字表示首次出现的字符串,提高图像文件的压缩效率。在解压缩时,利用压缩数据重建词典,确保正确解码。
摘要由CSDN通过智能技术生成

实验内容和原理

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+
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值