Delphi使用Zlib

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 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值