王骏的BLOG
编程、网络技术点滴...
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
公告

留言簿(31)

随笔分类

随笔档案

文章分类

文章档案

相册

WEB开发

相关链接

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-113 文章-5 评论-212 Trackbacks-0

为了节省带宽许多网站都采用GZip压缩页面,Apache,PHP都能提供GZip支持,经GZip压缩的HTTP页面的HTTP头有如下标记:Content-Encoding = gzip
GZip数据以0x1f,0x8B开头,文件头长度通常为10。
用zlib的uncompress无法解成功,测试了网上许多版本都失败,最后总结了可行的代码:

int GZipUncompress(Byte *dest, uLong *destLen, Byte *src, uLong srcLen)  
{  
 // 本文来源 http://www.okbase.net
 int err;  
 z_stream d_stream;  
 memset(&d_stream, 0, sizeof(z_stream));  
   
 d_stream.next_in = src;
 d_stream.avail_in = srcLen; 
 d_stream.next_out = dest; 
 d_stream.avail_out = *destLen;
   
 err = inflateInit2(&d_stream, -MAX_WBITS);
 if(err != Z_OK)
  return(err);

 d_stream.next_in += 10L; // 跳过GZip文件头,这里没有仔细处理,长度可以通过文件头数据取得

 err = inflate(&d_stream, Z_FINISH);
 if (err != Z_STREAM_END) {
        inflateEnd(&d_stream);
        return err == Z_OK ? Z_BUF_ERROR : err;
    }

 *destLen = d_stream.total_out;

 err = inflateEnd(&d_stream); 
 return(err);  
}  

// 测试代码
char *pMem = ... // 数据源
int MemSize; // 数据源长度

unsigned long BufferSize = MemSize * 6;
char *pBuffer = new char[BufferSize];  // BufferSize要足够大
   memset(pBuffer, 0, BufferSize);

   int result = GZipUncompress((unsigned char *)pBuffer, &BufferSize, (unsigned char *)pMem, MemSize);
   if(result == Z_OK)
   { 
    // 成功
   }

// 需要改进的几点问题
(1)没有处理目标缓冲区大小不够的情况
(2)跳过GZip文件头的长度没有从文件头中读取
时间不够,需要的朋友请自行修改,改好了记得贴一下自己的代码哦!

posted on 2009-11-04 21:49 王骏的BLOG 阅读(1035) 评论(2)  编辑 收藏
Comments
  • # re: GZip格式的HTTP页面的解压缩(依赖zlib)
    凡客诚品官方网站
    Posted @ 2009-11-07 12:46
    网上确实存在许多版本都失败
  • # re: GZip格式的HTTP页面的解压缩(依赖zlib)
    倍美丛
    Posted @ 2009-11-12 15:19
    看看,复制一份研究一下
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]