我正在使用Delphi XE 8并尝试解压缩gzip文件。 我直接从Embarcadero网站上复制了以下代码作为示例,但是我得到了“带有消息'数据错误的EZDecompressionError'。
procedure DecompressGzip(inFileName : string);
var
LInput, LOutput: TFileStream;
LUnZip: TZDecompressionStream;
begin
{ Create the Input, Output, and Decompressed streams. }
LInput := TFileStream.Create(InFileName, fmOpenRead);
LOutput := TFileStream.Create(ChangeFileExt(InFileName, 'txt'), fmCreate);
LUnZip := TZDecompressionStream.Create(LInput);
{ Decompress data. }
LOutput.CopyFrom(LUnZip, 0);
{ Free the streams. }
LUnZip.Free;
LInput.Free;
LOutput.Free;
end;
我正在尝试解压缩的示例文件位于: http://ftp.nhc.noaa.gov/atcf/aid_public/
答案 0 :(得分:4)
您的代码是正确的,但您忘记启用zlib
来检测gzip
标头(默认情况下,唯一识别的数据格式是zlib格式)。您必须调用TDecompressionStream.Create(source: TStream; WindowBits: Integer)
重载的构造函数,并指定zlib
对gzip
标头的流的深度:{/ p>
procedure TForm2.FormCreate(Sender: TObject);
var
FileStream: TFileStream;
DecompressionStream: TDecompressionStream;
Strings: TStringList;
begin
FileStream := TFileStream.Create('aal012015.dat.gz', fmOpenRead);
{
windowBits can also be greater than 15 for optional gzip decoding. Add
32 to windowBits to enable zlib and gzip decoding with automatic header
detection, or add 16 to decode only the gzip format (the zlib format will
return a Z_DATA_ERROR).
}
DecompressionStream := TDecompressionStream.Create(FileStream, 15 + 16); // 31 bit wide window = gzip only mode
Strings := TStringList.Create;
Strings.LoadFromStream(DecompressionStream);
ShowMessage(Strings[0]);
{ .... }
end;
如需进一步参考,请查看zlib
manual,this question也可能有用。
答案 1 :(得分:0)
您正在尝试将数据视为zlib压缩。但是,这与gzip压缩数据不兼容。虽然两种格式都使用相同的内部压缩算法,但它们具有不同的标题。
要解压缩gzip我引用这个问题:How to decode gzip data? Remy在那里的答案解释了如何使用Indy的TIdCompressorZLib
解压缩gzip数据。