LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2071|回复: 3

zlib如何在内存中把数据压缩成gzip或者解压缩gzip?

[复制链接]
发表于 2007-3-19 01:10:57 | 显示全部楼层 |阅读模式
zlib如何在内存中把数据压缩成gzip或者解压缩gzip?
发表于 2007-3-19 10:13:10 | 显示全部楼层
zlib 源码包中有 example.c, 展示了各种用法. 另有 examples 目录, 包括一些更丰富的展示及一些文档
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-19 14:31:03 | 显示全部楼层
我看zlib的FAQ上面说解压缩gzip格式只要用inflateInit2就可以了,但是我试了一下发现程序报Z_DATA_ERROR,不知道为什么.下面是解压缩函数,它根据gzip参数来判断是用解压缩gzip还是解压缩deflate,大家看看有什么需要修改的吗?


  1. int inflate_read(char *source,int len,char **dest,int gzip) {
  2.         int ret;
  3.         unsigned have;
  4.         z_stream strm;
  5.         unsigned char out[CHUNK];
  6.         int totalsize = 0;

  7.         /* allocate inflate state */
  8.         strm.zalloc = Z_NULL;
  9.         strm.zfree = Z_NULL;
  10.         strm.opaque = Z_NULL;
  11.         strm.avail_in = 0;
  12.         strm.next_in = Z_NULL;
  13.        
  14.         if(gzip)
  15.                 ret = inflateInit2(&strm, 15);
  16.         else
  17.                 ret = inflateInit(&strm);
  18.                
  19.         if (ret != Z_OK)
  20.                 return ret;

  21.         strm.avail_in = len;
  22.         strm.next_in = source;

  23.         /* run inflate() on input until output buffer not full */
  24.         do {
  25.                 strm.avail_out = CHUNK;
  26.                 strm.next_out = out;
  27.                 ret = inflate(&strm, Z_NO_FLUSH);
  28.                 assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
  29.                 switch (ret) {
  30.                 case Z_NEED_DICT:
  31.                         ret = Z_DATA_ERROR;     /* and fall through */
  32.                 case Z_DATA_ERROR:
  33.                 case Z_MEM_ERROR:
  34.                         inflateEnd(&strm);
  35.                         return ret;
  36.                 }
  37.                 have = CHUNK - strm.avail_out;
  38.                 totalsize += have;
  39.                 *dest = realloc(*dest,totalsize);
  40.                 memcpy(*dest + totalsize - have,out,have);
  41.         } while (strm.avail_out == 0);

  42.         /* clean up and return */
  43.         (void)inflateEnd(&strm);
  44.         return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
  45. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-3-19 19:37:03 | 显示全部楼层
不管正确与否, 先收藏了. 感谢 asert 兄
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表