uses System.ZLib;
const
ZLIB_GZIP_WINDOWBITS = 31;
ZLIB_DEFLATE_WINDOWBITS = 15;
type
TZLibCompressionLevel = TZCompressionLevel;
///
/// 使用 ZLib 压缩流
///
/// 要压缩的数据流
/// 压缩后的数据流
/// 压缩级别
/// 是否使用 GZip 压缩算法
procedure ZLibCompressStream(Source, Dest: TStream;
const Level: TZLibCompressionLevel = zcFastest;
const GZipFormat: Boolean = True); overload;
///
/// 使用 ZLib 解压缩流
///
/// 要解压的数据流
/// 解压后的数据流
/// 是否使用 GZip 压缩算法
procedure ZLibDecompressStream(Source, Dest: TStream;
const GZipFormat: Boolean = True); overload;
procedure ZLibCompressStream(Source, Dest: TStream; const Level: TZLibCompressionLevel;
const GZipFormat: Boolean);
var
WindowBits: Integer;
Zip: TZCompressionStream;
begin
if GZipFormat then
WindowBits := ZLIB_GZIP_WINDOWBITS
else
WindowBits := ZLIB_DEFLATE_WINDOWBITS;
Zip := TZCompressionStream.Create(Dest, Level, WindowBits);
try
Zip.CopyFrom(Source, 0);
finally
FreeAndNil(Zip);
end;
end;
procedure ZLibDecompressStream(Source, Dest: TStream; const GZipFormat: Boolean);
var
WindowBits: Integer;
UnZip: TDecompressionStream;
begin
if GZipFormat then
WindowBits := ZLIB_GZIP_WINDOWBITS
else
WindowBits := ZLIB_DEFLATE_WINDOWBITS;
UnZip := TDecompressionStream.Create(Source, WindowBits);
try
Dest.CopyFrom(UnZip, 0);
finally
FreeAndNil(UnZip);
end;
end;