gzip解压_银河麒麟gzip解压

gzip解压_银河麒麟gzip解压1、首先说为什么采用zlib解压,因为zlib可以解压内存数据。2、下载zlib库后,自己在projcts目录里面根据需要编译lib库3、静态链接只需要zlib.h;zconf.h;zlib.lib三个文件即可(动态的不介绍了)4、解压函数:[html]viewplaincopyprint?/* HTTP gzip decomp

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺



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

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

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

4、解压函数:

  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. }  
gzip解压_银河麒麟gzip解压
/* 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.net/196279.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • STM32CubeMX学习–(5)SPI读写W25Q128

    CUBE配置SPI配置引脚配置参数配置点击生成代码代码修改 uint8_tData1[4]={0x90,0x00,0x00,0x00}; uint8_tData2[2]={0x00,0x00}; uint8_tRxData[2]={0x00,0x00};/****************************/while(1){ HAL_GP…

    2022年4月13日
    200
  • linux局域网传输文件,局域网传输文件详解(转)[通俗易懂]

    linux局域网传输文件,局域网传输文件详解(转)[通俗易懂]局域网传输文件详解(转)相信很多朋友都有过这样的经历,在办公室需要通过局域网传输文件。如果顺利自然不必说了,但有时难免也会遇到“不测”,尤其是直接移动文件,万一失败损失惨重,虽然几率不大但毕竟存在。我们该如何做呢?大家知道,本身的复制功能是不能实现断点续传的,也就是说如果在局域网中复制文件一旦失败,原先复制的文件就要重新复制,这种情况相信大家也曾有过体会,难道在局域网中复制文件还不如在互联网上下…

    2022年5月11日
    58
  • Pandas个人操作练习(1)创建dataframe及插入列、行操作

    Pandas个人操作练习(1)创建dataframe及插入列、行操作使用pandas之前要导入包:importnumpyasnpimportpandasaspdimportrandom#其中有用到random函数,所以导入一、dataframe创建pandas.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)data:numpy…

    2022年4月27日
    99
  • 1、win10下的python3.5.4安装

    现在越来越多人入坑python了,当然我也不例外。作为一个java程序员的我,在空余时间就慢慢学习python了 。第一件事就是安装Python啦。(主要以Python 3.5.4为例)一、官网下载安装包官网地址:https://www.python.org/downloads/windows/ 都说越新越好嘛,其实我觉得都差不多,但是3.6跟3.5还是有点区别的嘛,所以我…

    2021年11月30日
    64
  • 处理Simulink的代数环的方法为逐个添加一阶惯性环节

    处理Simulink的代数环的方法为逐个添加一阶惯性环节处理Simulink的代数环的方法为逐个添加一阶惯性环节。代数环实际上是微分方程的输入在第一步没有值,而如果串联一个积分器的话就可以有初值,从而避免。通过增加一个一个时步的惯性环节,实现在基本不改变输出的情况下避免代数环。测试是可行的。…

    2022年10月5日
    3
  • python3.8安装matplotlib_matplotlib画图

    python3.8安装matplotlib_matplotlib画图1.直接打开命令提示符(快捷键window+r)2.若提示安装失败(Python——Youareusingpipversion9.0.1,howeverversion10.0.1isavailable.),输入python-mpipinstall-Upipsetuptools进行升级。安装成功,则下图所示:3.安装成功后,输入pytho…

    2022年8月31日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号