• Delphi 使用 ZLib 压缩和解压 GZip


         ZLib是DEFLATE算法的实现库,它的API同时支持gzip文件格式以及一个简化的数据流格式。zlib数据流格式、DEFLATE以及gzip文件格式均已被分别标准化为 RFC 1950、RFC 1951、RFC 1952。

        gzip在 HTTP压缩,一种在万维网中加速传输HTML和其他内容的技术。它是在 RFC 2016 中规定的三种标准HTTP压缩格式之一。这个RFC页定义了一种叫做"DEFLATE"的zlib格式,它和gzip格式相同,除了gzip添加了11字节头部和尾部的负载。但是,现在还是建议使用gzip而不是zlib,因为根据 RFC 1950, IE还没有正确的实现该标准,还不能处理zlib格式。

        Delphi 使用 ZLib 压缩和解压 GZip:

    uses System.ZLib;
    
    const
      ZLIB_GZIP_WINDOWBITS    = 31;
      ZLIB_DEFLATE_WINDOWBITS = 15;
    
    type
      TZLibCompressionLevel = TZCompressionLevel;
    
      /// <summary>
      /// 使用 ZLib 压缩流
      /// </summary>
      /// <param name="Source">要压缩的数据流</param>
      /// <param name="Dest">压缩后的数据流</param>
      /// <param name="Level">压缩级别</param>
      /// <param name="GZipFormat">是否使用 GZip 压缩算法</param>
    procedure ZLibCompressStream(Source, Dest: TStream;
      const Level: TZLibCompressionLevel = zcFastest;
      const GZipFormat: Boolean = True); overload;
    
    /// <summary>
    /// 使用 ZLib 解压缩流
    /// </summary>
    /// <param name="Source">要解压的数据流</param>
    /// <param name="Dest">解压后的数据流</param>
    /// <param name="GZipFormat">是否使用 GZip 压缩算法</param>
    procedure ZLibDecompressStream(Source, Dest: TStream;
      const GZipFormat: Boolean = True); overload;
      
    procedure ZLibCompressStream(Source, Dest: TStream; const Level: TZLibCompressionLevel; 
        const GZipFormat: Boolean);
    var
      WindowBits: Integer;
      Zip: TZCompressionStream;
    begin
      if GZipFormat then
        WindowBits := ZLIB_GZIP_WINDOWBITS
      else
        WindowBits := ZLIB_DEFLATE_WINDOWBITS;
    
      Zip := TZCompressionStream.Create(Dest, Level, WindowBits);
      try
        Zip.CopyFrom(Source, 0);
      finally
        FreeAndNil(Zip);
      end;
    end;
    
    procedure ZLibDecompressStream(Source, Dest: TStream; const GZipFormat: Boolean);
    var
      WindowBits: Integer;
      UnZip: TDecompressionStream;
    begin
      if GZipFormat then
        WindowBits := ZLIB_GZIP_WINDOWBITS
      else
        WindowBits := ZLIB_DEFLATE_WINDOWBITS;
    
      UnZip := TDecompressionStream.Create(Source, WindowBits);
      try
        Dest.CopyFrom(UnZip, 0);
      finally
        FreeAndNil(UnZip);
      end;
    end;

  • 相关阅读:
    SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试
    sql 知识点
    javascript基础拾遗——词法作用域
    Linux 软件包管理
    涉略spring
    WebReBuild年会流水记
    javascript面向对象学习笔记(一)——继承
    算法学习——动态规划策略入门
    编程之美读书笔记——2.3寻找水王
    Linux 引导流程解析
  • 原文地址:https://www.cnblogs.com/rtcmw/p/12863055.html
Copyright © 2020-2023  润新知