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.
    

      

  • 相关阅读:
    android之间传递list
    android 中string.xml中的%1$s
    android activity传递实体类对象
    android 通过getDimension,getDimensionPixelOffset和getDimensionPixelSize获取dimens.xml文件里面的变量值
    android 获取屏幕的宽和高
    android dialog弹出的情况下监听返回键
    join on用法
    android webview加载网络连接
    HDU 5025 Saving Tang Monk 【状态压缩BFS】
    ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11100238.html
Copyright © 2011-2022 走看看