如何使用TDecompressionStream?

时间:2014-05-31 21:41:24

标签: delphi http gzip decode

我想解压缩一个gzip数据(一个http消息体),我尝试了下面的代码,但是它没有工作,当我尝试从流中读取时它会引发异常。有什么问题?

uses zlib;

procedure TForm1.Button1Click(Sender: TObject);
var InStream: TStream;
    ZStream: TDecompressionStream;
    s:string;
    x:int64;
begin
 InStream:=TMemoryStream.Create;

 s:='...the gziped body here...';   //binary string
 InStream.Write(s[1],length(s));
 InStream.Seek(0, soFromBeginning);

 ZStream:=TDecompressionStream.Create(InStream);
 SetLength(s,10000);
 x:=ZStream.Read(s[1],10000);
 SetLength(s,x);

 Label1.Caption:=s;

 InStream.Free;
 ZStream.Free;
end;

1 个答案:

答案 0 :(得分:2)

  

当我尝试从流中读取时,它会引发异常。有什么问题?

最合理的解释是您没有将有效的GZIP编码数据传递给流。我们不可能说出为什么你的数据无效,因为我们不知道它的来源。要解决您的问题,首先必须解决数据无效的原因。

您的代码的一个明显问题是使用字符串来表示二进制数据。 GZIP对二进制数据进行操作。它将字节数组压缩为字节数组。要使用文本,您可以使用预定的编码将文本转换为二进制。压缩后,您可以使用MIME或base64之类的东西将压缩二进制文件编码为文本。也许您的数据是这种形式:二进制编码为文本。

另一个可能的问题是你的Delphi zlib单位有缺陷,或者只是过时了。您没有在问题中说明您使用的是哪个版本的Delphi。也许您使用的是旧版本的Delphi,它没有zlib单元附带,并且正在使用第三方zlib单元,这是不好的。