您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi使用Zlib示例代码

时间:2011/9/3 15:37:32 点击:

  核心提示:useszlib; //将Src使用Zlib压缩后存入Dst当中 procedure PackStream(const Src:TStream; Dst:TStream); varCompStream...

uses
  zlib;

//将Src使用Zlib压缩后存入Dst当中
procedure PackStream(const Src:TStream; Dst:TStream);
var
  CompStream: TCompressionStream;
begin
  //增加“断言”以防止输入参数有误
  Assert(Src <> Nil);
  Assert(Dst <> Nil);

  CompStream := TCompressionStream.Create(clDefault,Dst);
  try
    //将源数据的偏移转到首部
    Src.Seek(0,soFromBeginning);
    //使用CopyFrom将源数据输入到压缩流,以实现压缩
    CompStream.CopyFrom(Src,0);
  finally
    CompStream.Free;
  end;
end;

//将以zlib压缩的Src解压缩后存入Dst当中
procedure UnpackStream(const Src:TStream; Dst:TStream);
var
  DecompStream: TDecompressionStream;
  NewSize: Int64;
begin
  //增加“断言”以防止输入参数有误
  Assert(Src <> Nil);
  Assert(Dst <> Nil);

  DecompStream:= TDecompressionStream.Create(Src);
  try
    //将源数据的偏移转到首部
    NewSize := Src.Seek(0, soFromEnd);
    Src.Seek(0, soFromBeginning);
    //使用CopyFrom将源数据输入到解压缩流,以实现解压缩
    //并得到实际解压缩后的数据大小(NewSize)
    //内部会使用AllocMem(System单元定义)对Dst进行内存重新分配
    //所以,Dst的内存管理必须兼容AllocMem进行内存分配
    NewSize := Dst.CopyFrom(DecompStream,NewSize);
    //重新设置Dst的实际大小(已经在解压缩过程当中进行重新分配)
    Dst.Size := NewSize;
  finally
    DecompStream.Free;
  end;
end;

//测试代码
procedure Test;
var
  SrcStream,PackedStream,UnpackedStream:TMemoryStream;
begin
  SrcStream := TMemoryStream.Create;
  try
    SrcStream.LoadFromFile('c:\test.xml');
    PackedStream := TMemoryStream.Create;
    try
      //压缩
      PackStream(SrcStream, PackedStream);

      PackedStream.Seek(0, soFromBeginning);
      PackedStream.SaveToFile('c:\test_xml.pk');
      UnpackedStream := TMemoryStream.Create;
      try
        //解压缩
        UnpackStream(PackedStream, UnpackedStream);

        UnpackedStream.Seek(0, soFromBeginning);
        UnpackedStream.SaveToFile('c:\test_xml.xml');
      finally
        UnpackedStream.Free;
      end;
    finally
      PackedStream.Free;
    end;
  finally
    SrcStream.Free;
  end;
end; 

作者:unsigned 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号