Delphi XE 8 - 如何解压缩gzip文件?

时间:2015-07-04 13:57:27

标签: delphi delphi-xe8

我正在使用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/

2 个答案:

答案 0 :(得分:4)

您的代码是正确的,但您忘记启用zlib来检测gzip标头(默认情况下,唯一识别的数据格式是zlib格式)。您必须调用TDecompressionStream.Create(source: TStream; WindowBits: Integer)重载的构造函数,并指定zlibgzip标头的流的深度:{/ 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 manualthis question也可能有用。

答案 1 :(得分:0)

您正在尝试将数据视为zlib压缩。但是,这与gzip压缩数据不兼容。虽然两种格式都使用相同的内部压缩算法,但它们具有不同的标题。

要解压缩gzip我引用这个问题:How to decode gzip data? Remy在那里的答案解释了如何使用Indy的TIdCompressorZLib解压缩gzip数据。