2011-12-21 2 views
2

я получил данные из веб-сервера:Как декодировать 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 относится к размеру первого фрагмента. Это будет полный размер HTML, только если в ответе есть только 1 кусок данных.

TIdHTTP внутренне обрабатывает данные для вас. Если деблокированные данные были gzip'ped, TIdHTTP может распаковать его для вас, если вы заранее назначили TIdZLibCompressorBase -удаленный компонент, такой как TIdCompressorZLib, до свойства TIdHTTP.Compressor.

+0

да, я знаю это. Я не получаю данные от TIdHTTP. – waza123

+0

Итак, я думаю, что кусок не может быть расшифрован, прежде чем вы получите все куски? – waza123

+0

Решено работать без фрагментов – waza123

1

Вы можете распаковать корпус gzipped http с помощью функции GZDecompressStr()ZlibExGz. Просто передайте данные, как именно вы получите их из сообщения ответа http, в качестве параметра, и он вернет распакованные данные.

uses ZlibExGz; 

var s:string; 

begin 
// read the gzipped data in "s" 
s:=GZDecompressStr(s); 
// now "s" contains uncompressed data 
end; 
Смежные вопросы