我是
靠谱客的博主
糟糕季节,最近开发中收集的这篇文章主要介绍
利用zlib库对HTTP收到的gzip数据解压,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
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);
最后
以上就是糟糕季节为你收集整理的利用zlib库对HTTP收到的gzip数据解压的全部内容,希望文章能够帮你解决利用zlib库对HTTP收到的gzip数据解压所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复