zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    华为机试题01背包问题
    丑数
    动态规划(1)
    Linux 后台启动 Redis
    redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.
    SQLServer从渣仔到小白
    cmder 增强型命令行工具
    总结在部署分布式爬虫环境过程中常见的若干问题
    【pymongo.errors】Cursor not found
    浅析scrapy与scrapy_redis区别
  • 原文地址:https://www.cnblogs.com/rtcmw/p/12863055.html
Copyright © 2011-2022 走看看