2011-12-21 101 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;