我想解压缩一个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;
答案 0 :(得分:2)
当我尝试从流中读取时,它会引发异常。有什么问题?
最合理的解释是您没有将有效的GZIP编码数据传递给流。我们不可能说出为什么你的数据无效,因为我们不知道它的来源。要解决您的问题,首先必须解决数据无效的原因。
您的代码的一个明显问题是使用字符串来表示二进制数据。 GZIP对二进制数据进行操作。它将字节数组压缩为字节数组。要使用文本,您可以使用预定的编码将文本转换为二进制。压缩后,您可以使用MIME或base64之类的东西将压缩二进制文件编码为文本。也许您的数据是这种形式:二进制编码为文本。
另一个可能的问题是你的Delphi zlib
单位有缺陷,或者只是过时了。您没有在问题中说明您使用的是哪个版本的Delphi。也许您使用的是旧版本的Delphi,它没有zlib
单元附带,并且正在使用第三方zlib
单元,这是不好的。