LZM编码

补充后的LZWDecode函数

void LZWDecode( BITFILE *bf, FILE *fp){
	int character;
	int new_code, last_code;//new_code为课中所讲的C,last_coed为课中所讲的P
	int phrase_length;
	unsigned long file_length;

	file_length = BitsInput( bf, 4*8);//计算输入文件的大小
	if( -1 == file_length) file_length = 0;
	/*需填充*/
	InitDictionary();//初始化词典
	last_code = -1;
	while (0 < file_length) {
		new_code = input(bf);
		if (new_code >= next_code) { // 输入的码字不在词典中
			d_stack[0] = character;//将上一个加入词典的字符串第一个字符赋给d_atack数组第一个元素
			phrase_length = DecodeString(1, last_code);//依次寻找P的母节点,赋给d_stack后续元素
		}
		else {
			phrase_length = DecodeString(0, new_code);//依次寻找P的母节点,赋给d_stack后续元素
		}
		character = d_stack[phrase_length - 1];
		while (0 < phrase_length) {
			phrase_length--;//d_stack中字符顺序与需要输出的字符顺序是反的,因此反向输出
			fputc(d_stack[phrase_length], fp);
			file_length--;
		}
		if (MAX_CODE > next_code) {	// add the new phrase to dictionary  确保词典长度不超过初始规定的最大长度
			AddToDictionary(character, last_code);
		}
		last_code = new_code;
	}
}

如果当前码字在词典中不存在,则将上一个接受到的字符串和P的第一个字符相连,输出并添加到词典中。
选取十种不同文件进行处理
在这里插入图片描述
其中ZIP和FLAC已经是压缩过的文件类型,对于两者进行LZW编码后数据量不降反增,这说明LZW编码并不能对所有类型的数据进行压缩,LZW编码压缩主要体现在对于重复出现的字符和字符串的压缩,也说明经过ZIP和FLAC两种压缩之后字符串重复概率并不高。
对于TXT,DOC,XML,XLS这样的文本文件有着比较好的压缩效果,在试验过程中最初TXT中文字较少,后来复制粘贴了几次,处理之后的压缩效果更好,也说明了LZW编码方式的特点。
对于EXE和APK两种文件,由于并不清楚它们数据的特点,并不能做出LZW编码后的预测和解释。
JPG文件也属于压缩后的文件,LZW编码后数据量变大应该和ZIP类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值