实验3 | LZW编解码

本文介绍了LZW编码的背景、编码与解码思路、特点,并通过编码验证及解码过程展示了其实现效果,涉及.txt、.jpg、.bmp、.pdf等多种文件格式。
摘要由CSDN通过智能技术生成

一、LZW背景介绍

J.Ziv和A.Lempel在1978年首次发表了介绍第二类词典编码算法的文章。在他们的研究基础上,Terry A.Welch在1984年发表了改进这种编码算法的文章,因此把这种编码方法称为LZW压缩编码。
LZW只输出代表词典中的字符串(String)的码字(code word)。这就意味在开始时词典不能是空的,它必须包含可能在字符流出现中的所有单个字符。即在编码匹配时,至少可以在词典中找到长度为1的匹配串。

二、LZW编解码

1、LZW编码思路在这里插入图片描述

2、LZW解码思路在这里插入图片描述

3、LZW编解码特点

(1)优点
LZW只需要扫一遍,具有自适应的特点;算法简单,便于快速实现。
(2)限制
字符串重复概率低时,影响压缩效率;词典中的字符串不再出现,影响压缩效率;从词典中查找词条费时。

三、验证编解码效果

1、LZW编码验证

我选取了.txt、.jpg、.bmp、.pdf四种格式的文件进行验证在这里插入图片描述

2、编码后再解码

将hello.txt文件编码为likeyou.zip,再将其解码为hello1.txt,结果如下:在这里插入图片描述
在这里插入图片描述

四、代码注释

/*
 * Definition for LZW coding 
 *
 * vim: ts=4 sw=4 cindent nowrap
 */
#include <stdlib.h>
#include <stdio.h>
#include "bitio.h"
#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

#define input(f) ((int)BitsInput( f, 16))
#define output(f, x) BitsOutput( f, (unsigned long)(x), 16)

int DecodeString( int start, int code);
void InitDictionary( void);

//打印词典
void PrintDictionary( void) 
{
   
	int n;
	int count;  
	for( n=256; n<next_code; n++)
	{
   
		count = DecodeString( 0, n);
		printf( "%4d->", n);
		while( 0<count--) 
			printf("%c", (char)(d_stack[count]));
		printf( "\n");
	}
}

//从解出的字符串存入d_stack栈中
int DecodeString( int start, int code)
{
   
	int count;  //计数
	count = start; 
	while( 0<=code)
	{
   
		d_stack[count] = dictionary[code
LZW (Lempel-Ziv-Welch) 算法是一种数据压缩算法,特别适合于文本数据。它的工作原理基于查找表,通过将频繁出现的字符串替换为更短的编码,减少存储空间。 在Python中实现LZW解码,你需要遵循以下步骤: 1. **创建字典**:初始时包含所有单字符的编码,比如`{' ':'0', 'a':'1', ...}`。 2. **读取输入流**:逐个读取输入串的字符。 3. **生成新词**:如果当前词不在字典中,将其添加到字典,并返回其长度作为新的编码。然后用新词的第一个字符与下一个字符组合生成一个新的词。 4. **编码循环**:重复步骤3,直到遇到终止符或者输入流结束。 5. **处理特殊情况**:如果遇到终止符或已达到最大编码值,更新字典并继续解码。 6. **解码过程**:看到编码后,从字典中获取相应的原始字符串,并替换编码。 下面是一个简单的Python实现LZW解码的示例: ```python def lzw_decode(code, dict_size=256): dict = {chr(i): i for i in range(dict_size)} code_dict = {0: '', ord(''): 0} # 初始化字典和编码字典 output = '' current_code = 0 for bit in bin(code)[2:]: current_code = (current_code << 1) + int(bit) if current_code not in code_dict: new_code = code_dict[output] + chr(current_code) code_dict[current_code] = new_code if len(code_dict) == dict_size: break output = code_dict[current_code] return output # 使用示例 compressed_data = bytes.fromhex('your_compressed_data_hex') # 假设这是压缩后的二进制数据 decoded_text = lzw_decode(compressed_data) ``` 请注意,这只是一个基础版本的LZW解码,实际应用可能需要处理更复杂的情况,如如何处理编码溢出、输入缓冲等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值