对于字符串"abac"
其对应ascii码为:
a--97
b--98
c--99
构造的哈夫曼编码为:
a--1
b--00
c--01
哈夫曼编码表建立如下映射关系:
a: 97 -- 1
b: 98 -- 00
c: 99 -- 01
原字符串表示为:
100101
(这里如果大于8位,则先处理前n个8位)
(如:11000110 001 先处理11000110)
转为10进制:
1 + 4 + 32 = 37
编码结果:
"abcd" -> 37
由37转为二进制:
37|256 = 293(这是为了补足八位,因为之前是按八位进行处理的,如果不补足会导致处理编码的长度不一致)
293转为二进制:100100101
由于之前编码时不足八位,那么取之前的最后六位
100 100101 -> 100101
逐个查询编码串 100101:
查询1,根据哈夫曼编码表查到映射关系: 1 -- 97,从1之后的0重新逐个查询
查询0,无映射关系
查询00,根据哈夫曼编码表查到映射关系: 00 -- 98,从00之后的1重新逐个查询
查询1,根据哈夫曼编码表查到映射关系: 1 -- 97,从1之后的0重新逐个查询
查询0,无映射关系
查询01,根据哈夫曼编码表查到映射关系: 01 -- 99
将97 98 97 99组成的字节数组重新写回到文件中,文件自动进行解析:
97 -- a
98 -- b
97 -- a
99 -- c
解码结果:
37 -> "abcd"
| 文本文件(txt) | 影像文件(mp3) | 图片(jpg,png) | 音乐文件(mp4) | 说明 |
|----------------|----------------|--------------|------------|
| 7072% | 4050% | 98100% | 98100% | 文件过大时会溢出 |
对于1MB以内的文本文件压缩率维持在70%左右,对于影像文件压缩效果好,但内容过大容易导致栈内存溢出,对图片和音乐文件压缩效果不明显。