[数据压缩]LZW编解码算法实现与分析

目录

实验目的​​​​​​​

实验原理

实验结果


实验目的

        掌握词典编码的基本原理,用C/C++/Python等语言编程实现LZW解码器并分析编解码算法。

实验原理

  • LZW编码

        LZW的编码思想是不断地从字符流中提取新的字符串,通俗地理解为新“词条”,然后用“代号”也就是码字表示这个“词条”。这样一来,对字符流的编码就变成了用码字去替 换字符流,生成码字流,从而达到压缩数据的目的。LZW编码是围绕称为词典的转换表 来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输 入是字符流,字符流可以是用8位ASCII字符组成的字符串,而输出是用n位(例如12位)表 示的码字流。

        具体步骤如下图

[数据压缩]LZW编解码算法实现与分析_第1张图片

  • LZW解码

        LZW解码算法开始时,译码词典和编码词典相同,包含所有可能的前缀根。

        具体步骤如下图

[数据压缩]LZW编解码算法实现与分析_第2张图片

 

实验结果

  • LZW编码文件

创建txt文件如下

​​​​​​​                经过编码,得到如下比特流文件

[数据压缩]LZW编解码算法实现与分析_第3张图片

  • LZW编码实现

1.代码实现

DecodeString函数

int DecodeString( int start, int code){
    //对当前码字的解码
	int count;
    count =start;
    while(0 <= code){
        d_stack[count] = dictionary[code].suffix;//写入d_stack
        code = dictionary[code].parent;
        count++;
    }
    return count;//返回字符串长度
}

LZWDecode函数

void LZWDecode( BITFILE *bf, FILE *fp){
    int character;//c
    int new_code;//cw
    int last_code;//pw
    int phrase_length; //字符大小
    unsigned long file_length; //文件大小

    file_length = BitsInput(bf, 4 * 8);//得到文件长度
    if (-1 == file_length){
        file_length = 0;
    }

    InitDictionary();//dictionary初始化
    last_code = -1;//码字为空

    while (0 < file_length) {
        new_code = input(bf);//读入码字
        if (new_code >= next_code) //不存在码字
        {
            d_stack[0] = character;//c存入d_stack
            phrase_length = DecodeString(1, last_code);//解码并计算字符串长度
        }
        else//存在码字
        {
            phrase_length = DecodeString(0, new_code);//解码
        }
        character = d_stack[phrase_length - 1];//第一个字符为c
        while (0 < phrase_length) {
            phrase_length--;//字符串大小
            fputc(d_stack[phrase_length], fp);//写入文件
            file_length--;//文件大小
        }
        if (MAX_CODE > next_code) {
            AddToDictionary(character, last_code);//写入dictionary
        }
        last_code = new_code;//cw=pw
    }
}

2.解码结果

对1中编码得到比特流文件进行解码得到txt文件

  • 压缩效率分析 

1.压缩结果

选取了十种不同格式的文件如下

[数据压缩]LZW编解码算法实现与分析_第4张图片 

经过LZW编码,得到如下比特流文件 

[数据压缩]LZW编解码算法实现与分析_第5张图片   

 对比得到如下表格

文件格式 编码前文件大小 编码后文件大小 压缩效率(%)
txt 154字节 142字节 92.2
pdf 13KB 22KB 169.2
jpg 116KB 156KB 134.5
png 861KB 1.1MB 130.8
bmp 1.8MB 2MB 111.1
yuv 786KB 829KB 105.5
mp3 590KB 729KB 123.6
wav 1.1MB 1.2MB 109.1
avi 2.3MB 2.7MB 117.4
mp4 333KB 413KB 124.0

2.分析

        LZW编码对于数据部分重复性高的文件压缩效果较好。以txt文件为例,我进行了两次txt压缩尝试,可以发现没有重复字节的txt文件没有被压缩。对重复性文字更多的文件,压缩效率获得了显著的提高。

原文件

原文件

大小

比特流文件

编码后

大小

压缩

效率

17字节
​​​​​​​
38字节 223.5%
[数据压缩]LZW编解码算法实现与分析_第6张图片

153

字节

[数据压缩]LZW编解码算法实现与分析_第7张图片

142

字节

92.2%

        在几种图像文件格式中,是yuv或bmp的压缩效果较好,也是因为数据部分所展示的重复的像素数据部分较多,便于LZW的压缩。

你可能感兴趣的:(数据压缩,c++)