zoukankan      html  css  js  c++  java
  • 通用压缩单元

    通用压缩单元

    /// <author>cxg 2020-7-7</author>
    /// 支持跨os,支持d7及以上版本
    unit zip;
    
    interface
    
    {$if CompilerVersion>= 21}  //d2010
      {$define NEWZLib}
    {$IFEND}
    
    uses
      Classes, Zlib, SysUtils;
    
    type
    {$if CompilerVersion< 18.5}  //d2007
      TBytes = array of Byte;
    {$IFEND}
    
      TZip = class(TObject)
      public
        /// <summary>
        ///   解压
        /// </summary>
        class procedure UnZipStream(const InStream, OutStream: TStream);
        class procedure UnZipBytes(const inbytes: TBytes; outbytes: TBytes);
        class procedure UnZipBuf(const inbuf: Pointer; insize: Integer; outbuf: Pointer; outsize: Integer);
        /// <summary>
        ///   压缩
        /// </summary>
        class procedure ZipStream(const InStream, OutStream: TStream);
        class procedure ZipBytes(const inbytes: TBytes; outbytes: TBytes);
        class procedure ZipBuf(const inbuf: Pointer; insize: Integer; outbuf: Pointer; outsize: Integer);
        class function verifyData(const buf; len: Cardinal): Cardinal;
        class function verifyStream(Stream: TStream; len: Cardinal): Cardinal;
      end;
    
    implementation
    
    class procedure TZip.UnZipBuf(const inbuf: Pointer; insize: Integer; outbuf: Pointer; outsize: Integer);
    begin
      {$IFDEF POSIX}
      ZLib.ZDecompress(inbuf, insize, outbuf, outsize);
      {$ELSE}
      {$if defined(NEWZLib)}
      ZLib.ZDecompress(inbuf, insize, outbuf, outsize);
      {$ELSE}
      Zlib.DecompressBuf(inbuf, insize, 0, outbuf, outsize);
      {$ifend}
      {$ENDIF}
    end;
    
    class procedure TZip.UnZipBytes(const inbytes: TBytes; outbytes: TBytes);
    {$if not defined(NEWZLib)}
    var
      InSize, OutSize: Integer;
      OutBuf: Pointer;
    {$ifend}
    begin
      {$IFDEF POSIX}
      ZLib.ZDecompress(inbytes, outbytes);
      {$ELSE}
      {$if defined(NEWZLib)}
      ZLib.ZDecompress(inbytes, outbytes);
      {$ELSE}
      InSize := Length(inbytes);
      Zlib.DecompressBuf(@inbytes[0], InSize, 0, OutBuf, OutSize);
      Move(OutBuf^, outbytes[0], OutSize);
      FreeMem(OutBuf, OutSize);
      {$ifend}
      {$ENDIF}
    end;
    
    class procedure TZip.UnZipStream(const InStream, OutStream: TStream);
    var
      l: Integer;
    
    {$IFDEF POSIX}
    var
      inBytes, OutBytes: TBytes;
    {$ELSE}
    var
      inBytes: TBytes;
      OutBuf: Pointer;
      Outsize: Integer;
    {$ENDIF}
    begin
      if InStream = nil then
        exit;
      l := InStream.Size;
      if l = 0 then
        Exit;
      {$IFDEF POSIX}
      SetLength(inBytes, l);
      InStream.Position := 0;
      InStream.Read(inBytes[0], InStream.Size);
      ZLib.ZDecompress(inBytes, OutBytes);
      OutStream.Size := Length(OutBytes);
      OutStream.Position := 0;
      OutStream.Write(OutBytes[0], Length(OutBytes));
      {$ELSE}
      setLength(inBytes, l);
      InStream.Position := 0;
      InStream.ReadBuffer(inBytes[0], l);
      {$if defined(NEWZLib)}
      ZLib.ZDecompress(@inBytes[0], l, OutBuf, Outsize);
      {$ELSE}
      Zlib.DecompressBuf(@inBytes[0], l, 0, OutBuf, Outsize);
      {$ifend}
      try
        OutStream.Size := Outsize;
        OutStream.Position := 0;
        OutStream.WriteBuffer(OutBuf^, Outsize);
      finally
        FreeMem(OutBuf, Outsize);
      end;
      {$ENDIF}
    end;
    
    class function TZip.verifyData(const buf; len: Cardinal): Cardinal;
    var
      i: Cardinal;
      p: PByte;
    begin
      i := 0;
      Result := 0;
      p := PByte(@buf);
      while i < len do
      begin
        Result := Result + p^;
        Inc(p);
        Inc(i);
      end;
    end;
    
    class function TZip.verifyStream(Stream: TStream; len: Cardinal): Cardinal;
    var
      l, j: Cardinal;
      lvBytes: TBytes;
    begin
      SetLength(lvBytes, 1024);
    
      if len = 0 then
      begin
        j := Stream.Size - Stream.Position;
      end
      else
      begin
        j := len;
      end;
    
      Result := 0;
    
      while j > 0 do
      begin
        if j < 1024 then
          l := j
        else
          l := 1024;
    
        Stream.ReadBuffer(lvBytes[0], l);
    
        Result := Result + verifyData(lvBytes[0], l);
        Dec(j, l);
      end;
    end;
    
    class procedure TZip.ZipBuf(const inbuf: Pointer; insize: Integer; outbuf: Pointer; outsize: Integer);
    begin
      {$IFDEF POSIX}
      ZLib.ZCompress(inbuf, insize, outbuf, outsize);
      {$ELSE}
      {$if defined(NEWZLib)}
      ZLib.ZCompress(inbuf, insize, outbuf, outsize);
      {$ELSE}
      ZLib.CompressBuf(@inbytes[0], insize, outbuf, outsize);
      {$ifend}
      {$ENDIF}
    end;
    
    class procedure TZip.ZipBytes(const inbytes: TBytes; outbytes: TBytes);
    {$if not defined(NEWZLib)}
    var
      insize, outsize: integer;
      OutBuf: Pointer;
    {$ifend}
    begin
      {$IFDEF POSIX}
      ZLib.ZCompress(inbytes, outbytes);
      {$ELSE}
      {$if defined(NEWZLib)}
      ZLib.ZCompress(inbytes, outbytes);
      {$ELSE}
      insize := Length(inbytes);
      ZLib.CompressBuf(@inbytes[0], insize, OutBuf, outsize);
      Move(OutBuf^, outbytes[0], outsize);
      FreeMem(OutBuf, outsize);
      {$ifend}
      {$ENDIF}
    end;
    
    class procedure TZip.ZipStream(const InStream, OutStream: TStream);
    {$IFDEF POSIX}
    var
      inBytes, OutBytes: TBytes;
    {$ELSE}
    var
      inBytes: TBytes;
      OutBuf: Pointer;
      Outsize: Integer;
    {$ENDIF}
    var
      l: Integer;
    begin
      if InStream = nil then
        exit;
      l := InStream.Size;
      if l = 0 then
        Exit;
      {$IFDEF POSIX}
      SetLength(inBytes, InStream.Size);
      InStream.Position := 0;
      InStream.Read(inBytes[0], InStream.Size);
      ZLib.ZCompress(inBytes, OutBytes);
      OutStream.Size := Length(OutBytes);
      OutStream.Position := 0;
      OutStream.Write(OutBytes[0], Length(OutBytes));
      {$ELSE}
      SetLength(inBytes, l);
      InStream.Position := 0;
      InStream.ReadBuffer(inBytes[0], l);
      {$if defined(NEWZLib)}
      ZLib.ZCompress(@inBytes[0], l, OutBuf, Outsize);
      {$ELSE}
      ZLib.CompressBuf(@inBytes[0], l, OutBuf, Outsize);
      {$ifend}
      try
        OutStream.Size := Outsize;
        OutStream.Position := 0;
        OutStream.WriteBuffer(OutBuf^, Outsize);
      finally
        FreeMem(OutBuf, Outsize);
      end;
      {$ENDIF}
    end;
    
    end.
    

      

  • 相关阅读:
    14. HTML 列表(无序, 有序, 定义)
    13. HTML table
    12. HTML图像
    11. HTML链接
    10. HTML CSS
    learning java AWT Pannel
    learning AWT Jrame
    learning java 正则表达式
    learning java java.time相关类
    learning java Calendar类
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/13264771.html
Copyright © 2011-2022 走看看