IE的deflate头

原创 2018年04月16日 10:24:01

网上搜来的关键几句话:

gzip与deflate区别
        deflate使用inflateInit(),而gzip使用inflateInit2()进行初始化,比 inflateInit()多一个参数: -MAX_WBITS,表示处理raw deflate数据。因为gzip数据中的zlib压缩数据块没有zlib header的两个字节。使用inflateInit2时要求zlib库忽略zlib header。在zlib手册中要求windowBits为8..15,但是实际上其它范围的数据有特殊作用,见zlib.h中的注释,如负数表示raw deflate。       

        Apache的deflate变种可能也没有zlib header,需要添加假头后处理。即MS的错误deflate (raw deflate).zlib头第1字节一般是0x78, 第2字节与第一字节合起来的双字节应能被31整除,详见rfc1950。例如Firefox的zlib假头为0x7801,python zlib.compress()结果头部为0x789c。

=========

好了,使用ZlibEx中的ZCompressStr进行压缩后发现头两个字节是0x7801,这个跟Firefox的zlib假头一毛一样。既然知道了假头是两个字节,剩下的事情就很简单了,把这两个字节直接删掉,然后告诉Indy我们发送的是deflate数据,再把数据流长度发过去后直接发送数据流,剩下的事情就交给浏览器去干了。关键代码像这样:

  sDest := ZCompressStr(sSrc);
  Result := Length(sDest) - 2;

  //删除两个字节的头
  if Result > 0 then
    AResponseInfo.ContentStream.Write(sDest[1 + 2], Result);

  ......

  //发送的数据格式和数据长度
  AResponseInfo.ContentEncoding := 'deflate';
  AResponseInfo.ContentLength := Result;
  AResponseInfo.WriteHeader;
  //发送数据内容
  AResponseInfo.ContentStream.Position := 0;
  AResponseInfo.WriteContent;

结果很漂亮,无论是IE还是Chrome都能很好的理解页面内容。

这可能是为数不多的原生程序用起来很爽的原因了:只要理解原理剩下的事情都是几行代码就能轻松解决的。另外,知道了压缩原理自然在解压时判断一下头两个字节然后根据需要加上两个字节的内容就可以从容进行解压了,代码就不写了。

顺便说说一些网页搜到的乱七八糟的误导(错误)内容:

1.gzip比deflate压缩比高但性能稍差。核心都是deflate算法,只是压缩比的选择不同而已。在相同压缩比下,除了gzip比无deflate头(两字节)多了18个字节(具体内容请参考相关文档)以外,没发现有任何区别(要是有区别的话问题就大了)。所以这种说法纯粹是胡说八道。

2.什么deflate是过时的压缩格式不建议使用等等内容。还是上面那句话,除了十几个字节的额外数据外,完全没发现有任何区别(还是那句话:有区别的话问题就大了),所以,这种说法同样是胡说八道。

真要吐槽的话,只能说:小白太多,胡说八道成本太低。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yayongm/article/details/79956951

gzip,deflate,zlib辨析

原帖:http://blog.csdn.net/wy_2012/article/details/6304946 deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进...
  • rainharder
  • rainharder
  • 2014-05-20 09:55:51
  • 11580

IE下的deflate模式

浏览器有一个非常有用的特性:自动解压。在使用AJAX请求数据的时候,数据在服务器端压缩传输,在浏览器端自动解压,请求直接得到解压后的结果。在Request Header中,一般会列出浏览器支持的压缩格...
  • mythma
  • mythma
  • 2015-10-10 13:27:04
  • 2009

httpClient的get请求 请求头gzip和deflate的乱码解决方案

利用httpClient下载页面,先利用浏览器查询页面源代码得知页面编码为utf-8,但生成字符串后总是为乱码,经过查询得知,在设置httpGet参数时,设置了接受压缩类型为Gzip,但却没有对其进行...
  • a137268431
  • a137268431
  • 2014-02-20 13:15:23
  • 4360

Accept-Encoding: gzip,deflate 以压缩格式接收请求数据

转自:http://www.cnblogs.com/linyawen/archive/2011/01/17/1937204.html IE和我们的代码使用的HTTP头里面都有这条内容...
  • hutao1101175783
  • hutao1101175783
  • 2015-01-11 21:01:18
  • 6659

“Accept-Encoding: gzip, deflate”问题

转载至http://zhidao.baidu.com/link?url=fG_OjaFDrklRpdeRpH_tlALrvNibI_IQnfMElOtdzNQ5MiLqM_4L039LCYXfPe-b...
  • angel_xiaa
  • angel_xiaa
  • 2016-07-18 11:01:21
  • 2812

deflate算法总结

一、LZ77算法基本概念 LZ77算法的说明网上很多,本文为个人见解,仅供参考。 本人认为LZ77算法其实是字典压缩的一个变种,与字典压缩不同的是,它的字典是动态生成的并且只有一个,一般选取一定数量...
  • Blues1021
  • Blues1021
  • 2015-04-21 08:55:29
  • 8368

deflate树与deflate编码

http://www.cnblogs.com/zengzy/p/5156130.html 关于deflate树,能搜到的资料非常少,这个概念来自gzip的压缩算法,是由huffm...
  • zdy0_2004
  • zdy0_2004
  • 2016-01-25 23:57:43
  • 731

简单的理解deflate算法

先说一下deflate算法吧.  deflate是zip压缩文件的默认算法.   其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用.   实际上deflate只是一种...
  • konglongaa
  • konglongaa
  • 2016-05-31 10:14:51
  • 1044

java实现deflate算法

转自:http://www.weixingon.com/s/java+deflate算法 想想一下,当你需要处理500TB的数据的时候,你最先要做的是存储下来。你是选择源文件存储呢?还是处理压缩...
  • konglongaa
  • konglongaa
  • 2016-05-31 10:21:01
  • 1141

GZIP压缩原理分析(17)——第五章 Deflate算法详解(五08) 算法分析(02) 格式说明(01) 块首部

以下内容包含我对RFC1951部分内容的翻译与总结,不足之处还请大家指出,小弟感激不尽。   在压缩中,哈夫曼编码有两种方式,分别是静态哈夫曼编码(Compression with fixed Huf...
  • jison_r_wang
  • jison_r_wang
  • 2016-07-30 14:53:57
  • 1324
收藏助手
不良信息举报
您举报文章:IE的deflate头
举报原因:
原因补充:

(最多只允许输入30个字)