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.
    

      

  • 相关阅读:
    斜二进制数
    贝贝的波浪数
    1058: 电文保密
    1065: 贝贝的加密工作
    低危漏洞- X-Frame-Options Header未配置
    1064: 不明飞行物(ufo)
    支付
    1067: 密室寻宝(find)
    c++10进制转换为任意2-16进制数字
    1066: 单词游戏(game)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11100238.html
Copyright © 2011-2022 走看看