洞房大花猫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前几天在酷壳上看到一篇 Huffam编码压缩算法 ,做为一个程序猿的我为了尽早变成工程尸毅然花了两天周末把这个算法实践了一下。终于,我把一个图片成功编码然后再解码,图片还是图片,还和原来一模一样,证明我的这个实现基本成功了。压缩效率不那么令人兴奋,和原图片一样大,都是180K左右,用二进制查看了一下编码后的文件,发现有的数据元素对应的编码长达11位,要知道我取的数据元素的长度是一个字节(八位),这样编码竟然比数据本身还要长!当然出现频率高的数据的编码应该会比较短,再加上字典所占的空间,所以编码后的文件就和原图片一样大了,基本上等于没压缩。

考虑到Jpg这种格式本来就是经过压缩的,我用压缩软件把图片压成7z,167K,成熟的压缩软件表现也好不到哪去嘛~  

刚开始写好程序的时候,编码再解码很小的文件可以将文件还原,稍大一点的文件就无法还原。Debug了下,发现原来是一个从文件中读取一个整型数据的函数有问题,我原来是这么写的:

1 int FileReaderImp::ReadInt()
2 {
3     char data[4];
4     _file.read(data, sizeof(data));
5     int ret = (data[3]<<24) + (data[2]<<16) 
6                 + (data[1]<<8) + (data[0]);
7     return ret;
8 }

忽略了char的符号问题,简单的相加不能得到正确的结果,如果用unsigned char,但是read函数只接收char*类型,所以我把实现改成了下面:

 1 int FileReaderImp::ReadInt()
 2 {
 3     char data[4];
 4     _file.read(data, sizeof(data));
 5     int ret = 0xffffffff;
 6     ret &= (data[3]<<24) | 0x00ffffff;
 7     ret &= (data[2]<<16) | 0xff00ffff;
 8     ret &= (data[1]<<8) | 0xffff00ff;
 9     ret &= (data[0]) | 0xffffff00;
10     return ret;
11 }

这样改了以后,才可以把一个180K的图片编码再解码然后还图片还是图片了。

猿马戳这里

 

posted on 2012-08-03 15:28  spencer24  阅读(354)  评论(0编辑  收藏  举报