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.
    

      

  • 相关阅读:
    学生排队 201703-2
    让动画停在最后一帧 forwards animation-fill-mode
    新版本的charles代理本地接口
    移动端调试插件Tencent / vConsole
    HDU
    Codeforces Round #668 (Div. 2)(A B C D)
    The 13th Chinese Northeast Collegiate Programming Contest
    2020, XIII Samara Regional Intercollegiate Programming Contest (B D)
    tarjan算法 双连通分量
    Codeforces Round #666 (Div. 2) (A B C D)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11100238.html
Copyright © 2011-2022 走看看