zlib用法

news/2024/7/20 16:13:42 标签: 内存管理

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; 

 

转载于:https://www.cnblogs.com/hnxxcxg/archive/2009/09/09/2940758.html


http://www.niftyadmin.cn/n/1072889.html

相关文章

php多重数组,PHP 处置多重数组

PHP 处理多重数组作者&#xff1a;林子木 wolinxuebin博客地址&#xff1a;http://my.csdn.net/wolinxuebin转载请保留今天在写PHP代码&#xff0c;要给手机端传送数据&#xff0c;数据是从mysql中取出来的。其中有个ID编号&#xff0c;mysql中存的是int型&#xff0c;取出来发…

C#之SByte

int8 C#中&#xff0c;byte为无符号8位整数&#xff0c;而Sbyte为有符号8位整数&#xff0c;对应java中的byte类型。 方法一将 byte 转为 sbyte。原理很简单&#xff0c;就是当 byte 小于 128 时其值保持不变&#xff0c;大于等于 128 时就将其减去 256。代码如下&#xff1a;…

WCF学习笔记(一)

WCF 简介Windows Communication Foundation (WCF) 是.NET Framework 的扩展&#xff0c;用来创建互连的系统。WCF 提供了创建安全的、可靠的、事务服务的统一框架&#xff0c;WCF 整合和扩展了现有分布式系统的开发技术&#xff0c;如Microsoft .Net Remoting、Web Services、W…

BZOJ4025: 二分图(LCT)

Description 神犇有一个n个节点的图。因为神犇是神犇&#xff0c;所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了&#xff0c;于是他想考考你。Input 输入数据的第一行是三个整数n,m,T。第2行到第m1行&#xff0c;…

常用代码

1. 打开新的窗口并传送参数&#xff1a; 传送参数&#xff1a; response.write("&#xff1c;script&#xff1e;window.open(’*.aspx?id"this.DropDownList1.SelectIndex"&id1"..."’)&#xff1c;/script&#xff1e;") 接收参数&a…

HttpWebRequest 编程相关问题

从个人经验来看&#xff0c;目前的 httpwebrequest 不是一个很成熟的类。 最关键的问题是它在处理 Cookies 上有些混乱&#xff0c;而 Cookies 是你访问那些需要认证网页的关键。 总结一下 Httpwebrequest 编程中主要的问题&#xff1a; Cookies 问题(重中之中)&#xff1b; 浏…

注册流程及细节部分优化整合

公司网站改版在紧锣密鼓的进行中&#xff0c;觉得目前这版的注册流程还需要再优化些就抽空搜罗下前人的经验&#xff0c;整合如下&#xff1a; 先来看看helicopter的这篇07年的译文Adaptive Path的一项研究比较了包括博客平台、社交网络、社区及其他四类、共20家2.0公司的注册页…

php with-zlib,rhel 5 x86_64下编译php出现错误(Try adding --with-zlib-)解决

config.log中同时有/usr/bin/ld: cannot find -lmysqlclient错误系统版本如下[rootopencms php-5.2.6]# uname -aLinux opencms 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux安装php-5.2.6的时候&#xff0c;编译选项如下&#xff1a;[r…