hdqqq

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  35 随笔 :: 0 文章 :: 104 评论 :: 0 Trackbacks

 

/*

    Zlib 是常用的压缩库,在很多平台上使用,是用c和部分汇编完成的,提供的是基于c接口的使用函数

zlib 的contrib中提供了三种基于iostream的使用方式.

 

   在MFC中,经常使用CFile进行文件的读写操作,在这种时候,如果想使用Zlib的话,要么使用zlib自身

提供的操作函数,要么使用zlib contrib中iostream操作流.或者自己对zlib进行封装.

 

所以我对zlib进行了封装,便于使用.

 

Filter 功能类

zlib_compress_filter<int 压缩级别> 实现压缩功能类,根据模板参数实现不同的压缩程度.  

zlib_uncompress_filter<int >  实现解压功能类,模板参数总为 1


Filter类自身带有 缓冲区, 可以存储处理后的数据,用户可以直接通过这两个Filter类对数据进行

压缩和解压缩操作.

 

Pipe类

    为了和MFC中的CFile类进行配接,对数据进行处理后,把CFile作为最后接受数据的容器,类似于

Boost库中的Sink,提供了一个模板实现的BufferPipe模板类.

 

template <typename filter,typename buffer_type, typename next_pipe> class BufferPipe;

模板参数:

filter  数据处理用filter

buffer_type 缓冲类型

next_pipe 后面接的pipe,可以是CFile,用于最终写入磁盘.

 

 

Pipe后还可以接一个Pipe,可以象一个管子连接起来,并且,以后通过扩充filter可以实现不同的数据操作功能.

 

提供了一个测试代码

编译后一个对话框 四个 按钮

 

按钮1 将 c:\a.bmp  压缩为 c:\b.cr     使用filter

按钮2 将 c:\b.cr  解压缩为 c:\c.bmp   使用filter

按钮3 将 c:\a.bmp 压缩为 c:\d.cr   使用pipe功能

按钮4 将 c:\a.bmp  通过压缩和解压缩管道, 存储为 e.bmp应该和a.bmp相同,用于测试管道的连接功能. 
 

代码位置:

http://www.cppblog.com/files/hdqqq/z_file.rar

编译需要的zlib 请自行到该库的网站下载.

这个文章实现的和boost中的filter类似的功能,可以和MFC配合使用.

不足:

fiter 使用的 buf_holder写得比较粗糙,以后有机会的话,改进.

*/

 

posted on 2006-09-01 13:03 hdqqq 阅读(5961) 评论(7)  编辑 收藏 引用 所属分类: c/c++

评论

# re: zlib 压缩管道 2006-09-03 16:58 chenger
为什么要把决定压缩程度的参数作为模板参数呢?看不出有这个必要,而且不直观  回复  更多评论
  

# re: zlib 压缩管道 2006-09-03 18:05 hdqqq_
压缩级别 总是要在某个地方设置的,作为模板参数,是为可可以在编译期就确定下来,当然,也可以有别的做法.  回复  更多评论
  

# re: zlib 压缩管道 2006-10-07 00:00 ar4ever
如何在VC6.0中使用Zlib库呢,我使用的时候老是出错。说是zlib1.dll是错误的。  回复  更多评论
  

# re: zlib 压缩管道 2006-11-22 16:28 hdqqq
@ar4ever
你可以在zlib的官方网站下载它的压缩包,以zlib1.2.3为例,解压缩后,其目录下的project子目录下,有vc 6 的工程文件,有8个项目,分别是汇编和c代码的dll和lib输出的工程,你编译全部后,把你要用的lib 和头文件 zlib.h 放到vc的include 和lib设置中就可以了.  回复  更多评论
  

# re: zlib 压缩管道 2009-04-07 16:13 guest
压缩级别作为运行时参数比较好,这样程序就稍微灵活了。  回复  更多评论
  

# re: zlib 压缩管道 2009-06-10 14:25 ayang
你这样的代码方式属于什么风格的?  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理