gzip 解压_简简单单_百度空间

gzip 解压_简简单单_百度空间

问题:
入问题,问题答案立即呈现在您眼前!

gzip格式rfc 1952 http://www.ietf.org/rfc/rfc1952.txt
deflate格式rfc 1951 http://www.ietf.org/rfc/rfc1951.txt
zlib开发库 http://www.zlib.net/manual.html

寻找gzip
获取一个网页数据返回的编码类型是gzip,我该怎么解压缩
HTTP头获取?
如何用vb获取网络上的xml文件,并解析内容
关于GZIP的解码
怎样解gzip的压缩
请问Wininet是否可以进行Gzip的http传输,尤其是post的时候!如果可以如何实现?
关于GZIP格式解压缩HTTP数据包的问题,我使用ZLIB为什么必须先保存文件,内存解压缩出错
无法获取$_SERVER["HTTP_REFERER"]
关于GZIP的问题,高分求解!!
.....
等都是关于gzip解压的
问题:
提取http的gzip内容,并解压。
关键点:
1 提取http数据包的内容,主要是gzip格式的
2 数据包的重组
3 在内存中解压gzip数据

这两个周过来,都是在网上过来的,得到网友的帮助不少,很是感激,为了不让这个问题继续困扰后来的un_gziper,特写此文。
1 数据包内存的提取:
关键的地方是找到gzip内存的开始位置以及如何确定gzip内容的大小
开始位置:“Content-Encoding: gzip\r\n\r\n”
gzip大小:“Content-Length:”后面的就是了
2 数据包的重组,一般网页的内容很少是一个数据包可以装得下的,所以都得进行gzip之后再用多个数据包进行传输
关键的地方是:
get请求数据包的ack和seq与http返回数据包的ack,seq有密切的联系:
举例说明:
get请求:ack=0,seq=0
http1:seq=0,ack=584
http2: seq=1420,ack=584
...
简单的分析说明可以看出,我们的算法设计:
首先得到get请求的ack,返回的数据包的seq等于这个值,同时记下这个数据包的ack,后面进行分包发送的http的数据包的ack都是这个值,这个是关键点之一,同时综合
Content-Length就可以得到gzip的全部内容。
至此,原始数据提取完毕,该是如何解压的问题了
3解压gzip
我做了上面的1,2步以后将内容保存到文件里面,用gzip命令可以打开,验证了数据的完整性。
而后我采用了zlib提供的uncompress函数,和大多数的网友一样,都是犯了一个致命的错误,没有仔细的阅读zlib的文档!导致一次次无谓的识别!
事实上zlib格式和gzib格式是有差别的,而uncompress是用来解压zlib格式文件的,这就是为什么会出现用compress函数压缩的数据,在内存中可以直接用uncompress函数进行解压的,而就不能解压gzip数据的问题!

后来测试了zlib包里面的example例子,算是对zlib有了一点点的了解,应该用inflate类函数进行解压!
当然这样遇到了问题,格式不对!
后来在网上看到的帖子:gzip格式用inflate函数还不行,必需要用inflateInit2(&strm, 47); !!!!!!!!!!!!!!!!!!
问题解决!
这里借用那位网友的源代码,同时对他表示感谢!

int inflate_read(char *source,int len,char **dest,int gzip)
{
int ret;
unsigned have;
z_stream strm;
unsigned char out[CHUNK];
int totalsize = 0;

/* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;

if(gzip)
ret = inflateInit2(&strm, 47);
else
ret = inflateInit(&strm);

if (ret != Z_OK)
return ret;

strm.avail_in = len;
strm.next_in = source;

/* run inflate() on input until output buffer not full */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret) {
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
inflateEnd(&strm);
return ret;
}
have = CHUNK - strm.avail_out;
totalsize += have;
*dest = realloc(*dest,totalsize);
memcpy(*dest + totalsize - have,out,have);
} while (strm.avail_out == 0);

/* clean up and return */
(void)inflateEnd(&strm);
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}

后记,这个过程是痛苦的,但也是幸福的!
这里我发起一个小小的倡议,对所有关注gzip解压的问题的网友:
我们都遇到了一个问题就是zlib的文档都是英文的,有个别网友翻译了开头的一小部分,但是这是不够的!
所以,我希望有兴趣的朋友可以一起来帮zlib的文档翻译成为中文!
有兴趣的可以加我!

posted on 2013-03-31 13:14 lexus 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2013/03/31/2991638.html

gzip 解压_简简单单_百度空间相关推荐

  1. HTML中chunked解码和gzip解压

    chunked编码 chunked编码的的好处 当访问的时动态页面时,服务器则无法预知内容的大小,因此需要一遍产生数据,一边发送数据,将数据分块发送(服务器通过响应头'Transfer-Encodin ...

  2. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  3. 将多个文件压缩成gzip,将gzip解压成多个文件

          第一步:文件压缩和解压缩方法 //解压gzip文件public static boolean extractZip(File file, File parent) {ZipFile zf ...

  4. linux gzip 解压 函数,获取http的gzip内容,并解压

    问题: 入问题,问题答案立即呈现在您眼前! 寻找gzip 获取一个网页数据返回的编码类型是gzip,我该怎么解压缩 HTTP头获取? 如何用vb获取网络上的xml文件,并解析内容 关于GZIP的解码 ...

  5. 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法

    转载自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html 百度网盘压缩下载文件的CRC校验错误的解决方法 从百度网盘用打包压缩方式下载的文件在解 ...

  6. mac 命令行 解压7z文件_命令行压缩解压7z

    命令行压缩解压一 7z 1) 简介7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压软件.主页:http://www.7-zip.org/中文主页:http://7z.spar ...

  7. war包解压不了_牛骨高汤的熬制方法,拿走不谢!有了这配方,还愁开不了小吃店?...

    秋风乍起,又是一年小吃季,我们去外面吃馄饨,牛肉面,羊肉面等带有汤汁的小吃,你都会感觉特别好吃,特别鲜!约上三五知己,吃得好不爽快.那为何自己在家做不出这么好的味道呢?是因为,你缺少了一个最重要的汤底 ...

  8. mac解压rar命令_苹果mac电脑上很好用的免费压缩软件?ezip压缩软件分享

    在开始之前,先问问用苹果电脑的大家一个问题,有没有遇到过这种情况呢?就是好不容易在网上找到了需要的素材,然后下载回来后发现,想解压却解压不了. 因为mac系统自带的压缩工具是不支持rar格式的,而在网 ...

  9. 解压ubi文件_请问为什么AM3352 NAND FLASH UBI文件系统挂载失败?

    本帖最后由 一只耳朵怪 于 2018-6-21 11:08 编辑 各位好: 在NAND FLASH中写入ubi文件系统,内核启动时出现挂载失败. SDK:ti-processor-sdk-linux- ...

最新文章

  1. 八个开源的 Spring Boot 学习资源,你值得拥有
  2. Apache Flink 1.10.0 发布 | 云原生生态周报 Vol. 38
  3. Spring事务管理器分类
  4. matlab求滤波器的冲激响应,在TMS320C5410上用MATLAB实现有限冲激响应滤波器
  5. Python 爬虫---(6) beautifulSoup 库的使用
  6. java单个变量的表达式_java中使用Lambda表达式的5种语法
  7. 实战篇:如何建设企业的营销管理和分析平台
  8. Ubuntu下增加Python的PATH环境变量
  9. hdu 4311 Meeting point-1 递推 多校联合赛(二) 第二题
  10. 英语四级高频词汇电子版_英语四级使用频率最高的580个词汇
  11. qq象棋辅助 android,QQ象棋自动下棋
  12. VHDL-任意分频器(50%占空比)
  13. matlab 找最小值位置,matlab 向量最小值位置
  14. 为第九大股东;此前40次增持民生银行A股股份
  15. web渗透测试----28、ARP欺骗
  16. linux内存管理笔记(四十二)----内存规整
  17. 解决macos13卡死转圈
  18. 了解arguments
  19. [数据库基础篇]——数据库系统概述、数据模型、数据库系统的结构、数据库系统的组成
  20. Linux objdump命令(反汇编、查看符号)

热门文章

  1. 大咖分享|蒋梦琴:浅谈数字化转型与数据治理
  2. 触摸屏TP基础学习笔记资料整理
  3. 数字前端是什么?就业如何?学习路径怎么安排?一文搞定所有疑问!
  4. 【牛津大学博士论文】量子自然语言处理范畴论
  5. pytorch构建YOLOV7网络结构
  6. 小白学习HC-05蓝牙透传模块(有实例讲解——自制手机app实现蓝牙控制单片机加热系统)第一天 :整体分析,理清思路
  7. 一、T100之料件管理
  8. 怎么换计算机的桌面背景6,台式电脑怎么换桌面壁纸
  9. 云安全实现高效预防 未来之路怎么走?
  10. VMware虚拟机与主机之间传输文件