基于霍夫曼编码的任意文件压缩程序

本程序主要使用霍夫曼编码对任意文件进行压缩。

程序的步骤如下:

如果有一个文件大小为8个bytes。


其中ascii为m的字符一共出现了n次:

m      n

1       3

2       2

3       1

4       1

5       1

以n的大小为依据构建霍夫曼树:

基于霍夫曼编码的任意文件压缩程序_第1张图片

如果将父节点通往左孩子的路径标识为0,通往右孩子的路径标识为1,则霍夫曼树变成如下:

基于霍夫曼编码的任意文件压缩程序_第2张图片

则出现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


最后:

这种算法只能对一些文件具有压缩效果,对某些文件可能出现压缩文件比原文件还大的现象。

本程序也只是初略地了解下该算法在文件压缩方面的应用,如有其它改进的地方,请大家多多指点。谢谢~

你可能感兴趣的:(基于霍夫曼编码的任意文件压缩程序)