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.
    

      

  • 相关阅读:
    LeetCode --- 字符串系列 --- 解码字母到整数映射
    LeetCode --- 字符串系列 --- 上升下降字符串
    LeetCode --- 字符串系列 --- 机器人能否返回原点
    集合 Set
    LeetCode --- 字符串系列 --- 唯一摩尔斯密码词
    LeetCode --- 字符串系列 --- 转换成小写字母
    LeetCode --- 字符串系列 --- 分割平衡字符串
    LeetCode --- 字符串系列 --- IP 地址无效化
    LeetCode --- 字符串系列 --- 左旋转字符串
    Revit二次开发八 事务标签值
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11100238.html
Copyright © 2011-2022 走看看