免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20492 | 回复: 7

[函数] gzip压缩的数据如何在内存中解压 [复制链接]

论坛徽章:
0
发表于 2009-02-03 10:45 |显示全部楼层
我查到gzip解压可以使用开业的gzip解压库,但是那个库,只能解压文件。 我的gzip压缩的数据,是从网络上获得的,放在内存中,如果把他存成文件,再解压,再读到内存中,也太浪费资源了,大家帮我想个能直接在内存中解压的方法啦

论坛徽章:
0
发表于 2009-02-03 11:04 |显示全部楼层
内存中解压压缩数据只有ZLIB,GZIP不可以的

论坛徽章:
0
发表于 2009-02-03 16:41 |显示全部楼层
原帖由 chentao_612 于 2009-2-3 10:45 发表
我查到gzip解压可以使用开业的gzip解压库,但是那个库,只能解压文件。 我的gzip压缩的数据,是从网络上获得的,放在内存中,如果把他存成文件,再解压,再读到内存中,也太浪费资源了,大家帮我想个能直接在内 ...

http://hispider.googlecode.com/s ... src/utils/zstream.c

  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, 47) != Z_OK) return -1;
  19.     while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
  20.         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
  21.         if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
  22.         if(err != Z_OK )
  23.         {
  24.             if(err == Z_DATA_ERROR)
  25.             {
  26.                 d_stream.next_in = (Bytef*) dummy_head;
  27.                 d_stream.avail_in = sizeof(dummy_head);
  28.                 if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
  29.                 {
  30.                     return -1;
  31.                 }
  32.             }
  33.             else return -1;
  34.         }
  35.     }
  36.     if(inflateEnd(&d_stream) != Z_OK) return -1;
  37.     *ndata = d_stream.total_out;
  38.     return 0;
  39. }
复制代码

论坛徽章:
0
发表于 2009-02-04 09:45 |显示全部楼层
参考 zlib 函数,使用 uncompress (char  *dest, int  *destLen,  char  *source,  int  sourceLen) 就可以在内存中对原始报文信息 source 进行解压缩处理。

论坛徽章:
0
发表于 2010-08-31 16:39 |显示全部楼层
这里有个问题 gzip 的内容发送过来

解压的过程 是可以 一点点的解压呢?

还是必须完全获取后才能解压?

如果对方的文件很大 要完全下载完才能解压 就有很多问题了。

论坛徽章:
0
发表于 2010-08-31 18:01 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2010-09-01 13:54 |显示全部楼层
本帖最后由 yulihua49 于 2010-09-01 13:55 编辑
我查到gzip解压可以使用开业的gzip解压库,但是那个库,只能解压文件。 我的gzip压缩的数据,是从网络上获得 ...
chentao_612 发表于 2009-02-03 10:45



    好像有内存压缩的库,网上搜搜。我自己也写了个内存压缩,专用于通信包压缩,快,特别适合小数据压缩,与zip,gzip不兼容。
压缩60K的JSON包到3K,3ms,解压0.1ms。

论坛徽章:
0
发表于 2011-10-14 10:44 |显示全部楼层
想问一下楼主,最后这个问题是怎么解决的?
我现在也遇到类似的问题,不知道该如何解决?
是Win32项目,Windows Mobile 6.0SDK
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP