• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi解压缩Gzip,使用ZlibEx[转]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
之前碰到用wininet下载下来的网页的源码为乱码的现象,刚开始以为是编码所致,但尝试各种解码方法之后发现,原来不是编码的问题。而是代码经过压缩了。在HTTP请求头里加上“accept-encoding: gzip, deflat”,可返回压缩之后的代码。如果不加,返回的就是未经过处理的代码。
但是,有些网站,不加“accept-encoding: gzip, deflat”HTTP头,还是返回经过压缩的代码。这就需要解压了。解压其实很简单,ZLibEx里的一个函数就搞定了。
 1 procedure DecompressGZip(AInStream, AOutStream: TStream);
 2 var
 3   pb1, pb2: Byte;
 4 begin
 5   AInStream.Seek(10);
 6   AInStream.Read(pb1, 1);
 7   AInStream.Seek(20);
 8   AInStream.Read(pb2, 1);
 9   AInStream.Position := 0;
10   AOutStream.Position := 0;
11   if (pb1 = $8B) and (pb2 = $8then
12     ZDecompressStream2(AInStream, AOutStream, 47)
13   else
14     AOutStream.CopyFrom(AInStream, AInStream.Size);  

15 end;

前面比较开头的两个字节$8B和$8是为了判断代码是否经过压缩。至于ZDecompressStream2的第三个参数“47”,在网上看到还有为“-10”的,不过在我这里写“-10”不行,这个参数还有待研究。 

 

另一篇对windowbits研究的博客

 

连上网搜资料加读代码,一共花了大约3个小时,到现在,大约清楚了这么几个问题:

  1. deflate 是最基础的算法,在 zlib 里面有实现
  2. gzip 在 deflate 的 raw data 前增加了 10 个字节的 gzheader,尾部添加了 8 个字节的校验字节(可选 crc32 和 adler32) 和长度标识字节,gzip 的 magic number 是 0×1f, 0×8b
  3. zlib 自己也有 header 和尾部校验的数据,如果使用 deflateInit 而不是 deflateInit2,或者 windowBits 设置为正数8~15的话
  4. zlib windowBits 设置为 16 第4位设置为1(即在原来值的基础上加16,感谢 antonio 同学的更正) 的时候,zlib 自己会产生一个 gzip 的头和尾,这种情况下 OS_CODE 被设置为 255(unknown),尾部校验使用 crc32 。问题是,既然 zlib 本身就提供了这种功能,为什么 apache 和 nginx 不用,反而都选择手工添加呢?
  5. 为 nginx 添加 deflate 支持,只需要把输出中的头,尾去掉,并把 Content-Encoding 改为 deflate 即可。18 个字节,就这样省下来了。

 原文链接:http://blog.developers.api.sina.com.cn/?p=47


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab学习GUI的基本操作发布时间:2022-07-18
下一篇:
Matlab学习笔记(三)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap