• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi使用Zlib

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap