压缩好了,就知道文件怎么存了
解压缩就超级简单了。
获取标记文件,判断比特位0还是1
遇见0直接解压缩
遇见0向前匹配DIST距离,找LEN长度。
解决 大于64K文件的压缩
针对上一篇无法解决64K以上文件也很好解决。
在读取文件后解决时,每次只需判断一下缓冲区的剩余数据够不够MIN_MATCH
不够的话从文件中读取WSIZE个,
那么在读取之前,先讲先行缓冲区窗口内的数据搬移到查找缓冲区,
同时更新哈希表中的位置数据,和冲突数据
直到读取到文件尾。
压缩效率
遇到的问题
1 缓冲区错用了char ,char不能会出现下标为负数的情况,导致数组下标越界。
2 寻找最长匹配的时候错用了UCH导致部分解码失败UCH接收256~258时发生错误,长度应该用USH接收,因为我们匹配为3~258
3 写压缩文件和解压缩时文件指针类型刚开始写的时普通类型,后期发现导致汉字出现乱码,解决方式:让文件指针以二进制方式
4 解压缩时,未及时刷新缓冲区,错将fflush(文件指针)写成fflush(stdout)
PS 这个错误导致我找错找了1天多。。哭死了~ 这下长记性了吧?
对LZ77 的压缩结果再压缩,效率就不怎么好了。
能否采用Huff曼的方式直接对LZ77结果再压缩?
**可以 ,但压缩率可能不是很好;
1 Huffman缺陷 :需要创建哈夫曼树,可能会很大
2 LZ77的标记信息也会参与Huffman压缩,因此,影响压缩率。
3 树大的话,内存可能压力比较大。
假设文件中含有200个不同种类的字节,
那么 总节点将是叶子结点200 +临时父亲199个 = 399个节点。即2n -1。
那么Huffman树就很大了 ,获取编码的效率就比较低了。
获取编码的方式: 递归到叶子。
解决方案: 范式哈夫曼树
范式哈夫曼树: 在哈夫曼树的基础上,做了强制约定:
1 同一层节点中,所有的叶子节点都调整的左边