zoukankan      html  css  js  c++  java
  • 对Zlib单元进行再封装

    对Zlib单元进行再封装

    低版本DELPHI,如D7,ZLIB.pas单元封装的很简陋,因此有必要再封装,以增加使用的便利性。

    高版本DELPHI,zlib.pas本身提供的接口已经相当完善。

    Zlib.pas是DELPHI自带的压缩单元,下面对对Zlib单元进行再封装,增加两个压缩函数,一个压缩流,一个压缩字符串:

    分别在D7和XE10.3.1下面,测试通过。

    unit Unit1;
    
    interface
    
    uses
      ZLib, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
      Forms, Dialogs;
    
    type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    // 两个过程都有Compress参数,这个参数用来决定进行压缩操作还是解压操作: True--压缩; false--解压.
    procedure Zip(Input, Output: TStream; Compress: Boolean); overload;
    
    function Zip(Input: string; Compress: Boolean): string; overload;
    
    implementation
    
    {$R *.dfm}
    
    procedure Zip(Input, Output: TStream; Compress: Boolean);
    const
      MAXBUFSIZE = 1024 * 16; //16 KB
    var
      CS: TCompressionStream;
      DS: TDecompressionStream;
      Buf: array[0..MAXBUFSIZE - 1] of Byte;
      BufSize: Integer;
    begin
      if Assigned(Input) and Assigned(Output) then
      begin
        if Compress then     // 压缩
        begin
          CS := TCompressionStream.Create(ZLib.clDefault, Output);
          try
            CS.CopyFrom(Input, 0); //从开始处复制
          finally
            CS.Free;
          end;
        end
        else
        begin        // 解压
          DS := TDecompressionStream.Create(Input);
          try
            BufSize := DS.Read(Buf, MAXBUFSIZE);
            while BufSize > 0 do
            begin
              Output.Write(Buf, BufSize);
              BufSize := DS.Read(Buf, MAXBUFSIZE);
            end;
          finally
            DS.Free;
          end;
        end;
      end;
    end;
    
    function Zip(Input: string; Compress: Boolean): string;
    var
      InputStream, OutputStream: TStringStream;
    begin
      if Input = '' then
        Exit;
      InputStream := TStringStream.Create(Input);
      try
        OutputStream := TStringStream.Create('');
        try
          Zip(InputStream, OutputStream, Compress);
          Result := OutputStream.DataString;
        finally
          OutputStream.Free;
        end;
      finally
        InputStream.Free;
      end;
    end;
    
    end.
    

      

  • 相关阅读:
    HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
    HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
    URAL 1664 Pipeline Transportation(平面图最大流)
    HDU 1250 Hat's Fibonacci(高精度)
    HDU 1042 N!(高精度乘)
    算法模板の计算几何
    算法模板の数据结构
    算法模板の数学&数论
    算法模板之图论
    HDU 3260/POJ 3827 Facer is learning to swim(DP+搜索)(2009 Asia Ningbo Regional)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11100238.html
Copyright © 2011-2022 走看看