DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 20
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/1/19 23:32:17
标题:
关于deflate的解压问题 浏览:1954
加入我的收藏
楼主: 下面这个网址http://comment.bilibili.com/5363767.xml
它的压缩类型是 Content-Encoding: deflate
浏览器访问没问题,但用ICS和CIS自带解压未能成功,用ZLIB也不成功。

类似网址 http://comment.bilibili.com/5363765.xml、http://comment.bilibili.com/5363761.xml 等,同样压缩类型是 Content-Encoding: deflate ,但能正常解压。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/20 11:41:11
1楼: 测试了一下,好像是那个地址的压缩头不标准,造成ZLIB解压失败,ICS调用的也是ZLIB的,CIS应该也是(这个我猜的^_^)。

不知道是zlib的问题还是网页本身的问题

浏览器兼容性好一点吧。
此帖子包含附件:
JPEG 图像
大小:218.3K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/20 11:42:37
2楼: 如果你用Fiddler,你会发现浏览器也会提示有问题,就是说Fiddler也不能完全识别这个。
所以感觉这个网页本身就有点问题,属于小概率事件。希望懂deflate流的人来研究一下。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2017/1/20 12:56:01
3楼: gzip?
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/1/20 14:57:36
4楼: TO wr960204 
不是GZIP,试过了用GZIP解压不行
----------------------------------------------
-
作者:
男 forjoylee (天地无缘) ★☆☆☆☆ -
普通会员
2017/1/21 16:52:26
5楼: 在内容前面添加2个字节  deflate_dummy_header: array [0..1] of Byte = (120, 1);
就可以。你得智能判断,不能所有deflate编码的页面全部加。给你一段参考代码片段
  zlibStrm.next_out := PByte(@dest);
      zlibStrm.avail_out := SizeOf(dest);
      ret := inflate(zlibStrm, Z_NO_FLUSH);

      if ret in [Z_OK, Z_STREAM_END] then
        isFirstByte := False
      else if (ret = Z_DATA_ERROR) and isFirstByte then
      begin
        inflateReset(zlibStrm);
        zlibStrm.next_in := @deflate_dummy_header[0];
        zlibStrm.avail_in := SizeOf(deflate_dummy_header);
        zlibStrm.next_out := PByte(@dest);
        zlibStrm.avail_out := SizeOf(dest);
        ret := inflate(zlibStrm, Z_NO_FLUSH);

        if ret = Z_OK then
        begin
          zlibStrm.next_in := PByte(buf);
          zlibStrm.avail_in := len;
          ret := inflate(zlibStrm, Z_NO_FLUSH);
        end;
      end;
----------------------------------------------
这家伙很懒,什么都没有留下。
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/1/21 19:54:05
6楼: 谢谢 天地无缘的指点
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/21 21:42:42
7楼: 同样感谢 天地无缘。。。本来想在zlib库按此做一下兼容,后来考虑到以后升级,还是写在外面了,效率上低了点。
 try   
      ZlibDecompressStream(FRawResponseData, FUnGzipDataIn);    
      FRawResponseData.LoadFromStream(FUnGzipDataIn);
    except
      on E: Exception do
      // CrystalMessage(E.Message)
      begin
        if FContentEncoding = 'deflate' then
        begin
          TmpStream := TBytesStream.Create();
          FRawResponseData.Position := 0;
          try
          try
          TmpStream.Write(deflate_dummy_header, 2);
          TmpStream.CopyFrom(FRawResponseData, FRawResponseData.Size);
          TmpStream.Position := 0;
          ZlibDecompressStream(TmpStream, FUnGzipDataIn);
          FRawResponseData.LoadFromStream(FUnGzipDataIn);
          except
          // CrystalMessage(E.Message)
          end;
          finally
          TmpStream.Free;
          end;
        end;
此帖子包含附件:
JPEG 图像
大小:390.6K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/23 11:16:49
8楼: nnd, 今天又试了一下http://comment.bilibili.com/5363767.xml,前天增加了头已经正常的,现在又不行了,是不是这个头还有什么讲究?

看了一下这个:
http://www.cnblogs.com/quanying/p/4719963.html,试了另一种头,也没用
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/23 14:08:49
9楼: 感觉可以真正结贴了,研究了一下头部的意义,这下终于知其所以然了。。。

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression


所以应该尝试这三个。。。或者说第一个和第三个,第二个是默认
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/1/29 16:22:51
10楼: 谢谢crystalmoon的研究
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2017/1/29 19:34:04
11楼: 可参考 httpsend 的做法,用 ZLibEx 的 ZLibExGZ.pas

    if fGZIPAllowed and (Pos('content-encoding: gzip', LowerCase(Headers.Text)) > 0) then
    begin
      try
        GZDecompressStream(Document, MemStream);
        bOK := True;
      except
        bOK := False;
      end;

      if bOK then
      begin
        Document.Clear;
        Document.LoadFromStream(MemStream);
      end;
    end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS