织梦CMS - 轻松建站从此开始!

罗索

使用zlib实现gzip格式数据的压缩和解压

落鹤生 发布于 2014-11-11 18:55 点击:次 
本身这段代码也是从网络上找来的,但是网上的内容都没有针对gzip做特别说明,所以直接拿来用的时候出了些问题,现将我修改后的发在这里。 注意代码中的注释部分,这里设置是专门针对gzip的,缺少了就不行了,gzip压缩格式和其他格式的区别就在这里。 Bytef就是unsigned
TAG: zlib  gzip  数据压缩  

本身这段代码也是从网络上找来的,但是网上的内容都没有针对gzip做特别说明,所以直接拿来用的时候出了些问题,现将我修改后的发在这里。

注意代码中的注释部分,这里设置是专门针对gzip的,缺少了就不行了,gzip压缩格式和其他格式的区别就在这里。
Bytef 就是 unsigned char,uLong就是 unsigned long,这些别名的设置都在zconf.h文件里面。

这里压缩和解压缩的数据都可以用java的GZIPInputStream和GZIPOutputStream来对应解压缩和压缩。
#include的头文件都是zlib自带的文件,可以在官网下载,具体的文件列表可以在这里看

  1. #ifndef GZIP_H 
  2. #define GZIP_H 
  3.   
  4. #include "zlib/zlib.h" 
  5.   
  6. /* Compress gzip data */ 
  7. /* data 原数据 ndata 原数据长度 zdata 压缩后数据 nzdata 压缩后长度 */ 
  8. int gzcompress(Bytef *data, uLong ndata, 
  9.                Bytef *zdata, uLong *nzdata) 
  10.     z_stream c_stream; 
  11.     int err = 0; 
  12.   
  13.     if(data && ndata > 0) { 
  14.         c_stream.zalloc = NULL; 
  15.         c_stream.zfree = NULL; 
  16.         c_stream.opaque = NULL; 
  17.         //只有设置为MAX_WBITS + 16才能在在压缩文本中带header和trailer 
  18.         if(deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 
  19.                         MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) return -1; 
  20.         c_stream.next_in  = data; 
  21.         c_stream.avail_in  = ndata; 
  22.         c_stream.next_out = zdata; 
  23.         c_stream.avail_out  = *nzdata; 
  24.         while(c_stream.avail_in != 0 && c_stream.total_out < *nzdata) { 
  25.             if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1; 
  26.         } 
  27.         if(c_stream.avail_in != 0) return c_stream.avail_in; 
  28.         for(;;) { 
  29.             if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break
  30.             if(err != Z_OK) return -1; 
  31.         } 
  32.         if(deflateEnd(&c_stream) != Z_OK) return -1; 
  33.         *nzdata = c_stream.total_out; 
  34.         return 0; 
  35.     } 
  36.     return -1; 
  37.   
  38. /* Uncompress gzip data */ 
  39. /* zdata 数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */ 
  40. int gzdecompress(Byte *zdata, uLong nzdata, 
  41.                  Byte *data, uLong *ndata) 
  42.     int err = 0; 
  43.     z_stream d_stream = {0}; /* decompression stream */ 
  44.     static char dummy_head[2] = { 
  45.         0x8 + 0x7 * 0x10, 
  46.         (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF, 
  47.     }; 
  48.     d_stream.zalloc = NULL; 
  49.     d_stream.zfree = NULL; 
  50.     d_stream.opaque = NULL; 
  51.     d_stream.next_in  = zdata; 
  52.     d_stream.avail_in = 0; 
  53.     d_stream.next_out = data; 
  54.     //只有设置为MAX_WBITS + 16才能在解压带header和trailer的文本 
  55.     if(inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1; 
  56.     //if(inflateInit2(&d_stream, 47) != Z_OK) return -1; 
  57.     while(d_stream.total_out < *ndata && d_stream.total_in < nzdata) { 
  58.         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ 
  59.         if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break
  60.         if(err != Z_OK) { 
  61.             if(err == Z_DATA_ERROR) { 
  62.                 d_stream.next_in = (Bytef*) dummy_head; 
  63.                 d_stream.avail_in = sizeof(dummy_head); 
  64.                 if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) { 
  65.                     return -1; 
  66.                 } 
  67.             } else return -1; 
  68.         } 
  69.     } 
  70.     if(inflateEnd(&d_stream) != Z_OK) return -1; 
  71.     *ndata = d_stream.total_out; 
  72.     return 0; 
  73.   
  74. #endif // GZIP_H 

 

(antipro )
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201411/17123.html]
本文出处:oschina 作者:antipro 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容