前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gzip解压_银河麒麟gzip解压

gzip解压_银河麒麟gzip解压

作者头像
全栈程序员站长
发布2022-10-04 17:42:57
2.6K0
发布2022-10-04 17:42:57
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

4、解压函数:

[html] view plain copy print ?

  1. /* HTTP gzip decompress */
  2. int httpgzdecompress(Byte *zdata, uLong nzdata,
  3. Byte *data, uLong *ndata)
  4. {
  5. int err = 0;
  6. z_stream d_stream = { 0 }; /* decompression stream */
  7. static char dummy_head[2] =
  8. {
  9. 0x8 + 0x7 * 0x10,
  10. (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
  11. };
  12. d_stream.zalloc = (alloc_func)0;
  13. d_stream.zfree = (free_func)0;
  14. d_stream.opaque = (voidpf)0;
  15. d_stream.next_in = zdata;
  16. d_stream.avail_in = 0;
  17. d_stream.next_out = data;
  18. //if (inflateInit2(&d_stream, -MAX_WBITS) != Z_OK) return -1;
  19. if (inflateInit2(&d_stream, 47) != Z_OK) return -1;
  20. while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
  21. d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
  22. if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
  23. if (err != Z_OK)
  24. {
  25. if (err == Z_DATA_ERROR)
  26. {
  27. d_stream.next_in = (Bytef*)dummy_head;
  28. d_stream.avail_in = sizeof(dummy_head);
  29. if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
  30. {
  31. return -1;
  32. }
  33. }
  34. else return -1;
  35. }
  36. }
  37. if (inflateEnd(&d_stream) != Z_OK) return -1;
  38. *ndata = d_stream.total_out;
  39. return 0;
  40. }
代码语言:javascript
复制
/* 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);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196279.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月7日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档