利用zlib库对HTTP收到的gzip数据解压

来源:互联网 发布:降维算法 编辑:程序博客网 时间:2024/06/03 01:33

1、首先说为什么采用zlib解压,因为zlib可以解压内存数据。

2、下载zlib库后,自己在projcts目录里面根据需要编译lib库

3、静态链接只需要zlib.h ;zconf.h;zlib.lib三个文件即可(动态的不介绍了)

4、解压函数:

/* HTTP gzip decompress */int httpgzdecompress(Byte *zdata, uLong nzdata,Byte *data, uLong *ndata){int err = 0;z_stream d_stream = { 0 }; /* decompression stream */static char dummy_head[2] ={0x8 + 0x7 * 0x10,(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,};d_stream.zalloc = (alloc_func)0;d_stream.zfree = (free_func)0;d_stream.opaque = (voidpf)0;d_stream.next_in = zdata;d_stream.avail_in = 0;d_stream.next_out = data;//if (inflateInit2(&d_stream, -MAX_WBITS) != Z_OK) return -1;if (inflateInit2(&d_stream, 47) != Z_OK) return -1;while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;if (err != Z_OK){if (err == Z_DATA_ERROR){d_stream.next_in = (Bytef*)dummy_head;d_stream.avail_in = sizeof(dummy_head);if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK){return -1;}}else return -1;}}if (inflateEnd(&d_stream) != Z_OK) return -1;*ndata = d_stream.total_out;return 0;}
直接调用就OK了 注意传入的buffer数据和长度都要赋值

eg:

  char* pDest =  new char[1024 * 16];
  uLong ulLength = 1024*16;
  gzdecompress((Byte*)precvBuff, nCount, (Byte*)pDest, &ulLength);





0 0
原创粉丝点击