2011-12-21 150 views
2

我从Web服务器数据:如何解码gzip编码的html?

data := ' 
HTTP/1.1 200 OK 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Content-type: text/html 
Transfer-Encoding: chunked 
Server: Apache 

3d5 
???????????????????????????????????? 
???????????????????????????????????? 
???????????????????????????????????? 
'; 

数据的大小为:3D5(十六进制) 全部存储到TIdBytes变量“数据”。

如何解码gziped数据,更改其中的内容,然后编码回来并编辑长度为3d5的新数据。

回答

6

Transfer-Encoding响应标头设置为chunked。这意味着服务器以块的形式发送主体数据,其中每个块指示其自己的大小,其中0长度的块指示数据的结尾。 3d5指的是第一个块的大小。只有在响应中只有1块数据的情况下,这将是HTML的完整大小。

TIdHTTP内部为您处理分块数据。如果已拆分的数据已经被格式化,则TIdHTTP可以为您解压,前提是将衍生组件(如TIdCompressorZLib)指定给TIdHTTP.Compressor属性。

+0

是的我知道。我没有收到TIdHTTP的数据。 – waza123 2011-12-21 23:19:21

+0

所以我认为在获得所有块之前,块不能被解码? – waza123 2011-12-21 23:38:40

+0

决定在没有块的情况下工作 – waza123 2011-12-22 00:04:59

1

您可以使用ZlibExGz单位的GZDecompressStr()函数对http压缩体进行解压缩。只需传递数据,就像从http响应消息中获取数据一样,作为参数,它将返回解压缩的数据。

uses ZlibExGz; 

var s:string; 

begin 
// read the gzipped data in "s" 
s:=GZDecompressStr(s); 
// now "s" contains uncompressed data 
end;