本程序主要使用霍夫曼编码对任意文件进行压缩。
程序的步骤如下:
如果有一个文件大小为8个bytes。
其中ascii为m的字符一共出现了n次:
m n
1 3
2 2
3 1
4 1
5 1
以n的大小为依据构建霍夫曼树:
如果将父节点通往左孩子的路径标识为0,通往右孩子的路径标识为1,则霍夫曼树变成如下:
则出现n次的字符所对应的的编码为p:
n p
3 1
2 01
1 001
1 0001
1 0000
最终该文件的霍夫曼编码为:
1 1 01 001 0001 01 0000 1
以8个bit为一个byte写入文件。
第一个byte:11010010
第二个byte:00101000
第三个byte:01000000 (最后6位补0)
可见8个自己最后压缩为3个字节。
在解压的时候要需要霍夫曼树,而霍夫曼树要由原始文件每个字节出现的个数来构建,
所以在压缩文件中还要写入每个字节出现的个数。因为1个byte最多表示256个数,所以int table[256]
来存放byte出现的次数,如果读到一个byte,则将table[byte]++。
构建出霍夫曼树后,就要根据霍夫曼编码进行解码,
1 1 01 001 0001 01 0000 1000000
如上编码的解码过程如下:
第1个为1,则指向根节点的右孩子,到达末节点,写入该节点对应的字符(ascii为1)。
......依次类推
写完原文件大小x个字节,则停止写入,所以原文件的大小也要被记录到压缩文件中。
所以最终的压缩文件结构如下:
源代码(linux c):
http://download.csdn.net/detail/todd911/7875053
压缩文件:
hfm -c filename
生成的压缩文件为filename.hfm
解压文件:
hfm -d filename.hfm
还原成文件filename
最后:
这种算法只能对一些文件具有压缩效果,对某些文件可能出现压缩文件比原文件还大的现象。
本程序也只是初略地了解下该算法在文件压缩方面的应用,如有其它改进的地方,请大家多多指点。谢谢~