马了个巴子 發表於 2020-5-10 13:53:00

Delphi 使用 ZLib 压缩和解压 GZip

<p>&nbsp; &nbsp; &nbsp;ZLib是DEFLATE算法的实现库,它的API同时支持gzip文件格式以及一个简化的数据流格式。zlib数据流格式、DEFLATE以及gzip文件格式均已被分别标准化为 RFC 1950、RFC 1951、RFC 1952。</p>
<p>&nbsp; &nbsp; gzip在 HTTP压缩,一种在万维网中加速传输HTML和其他内容的技术。它是在 RFC 2016 中规定的三种标准HTTP压缩格式之一。这个RFC页定义了一种叫做"DEFLATE"的zlib格式,它和gzip格式相同,除了gzip添加了11字节头部和尾部的负载。但是,现在还是建议使用gzip而不是zlib,因为根据 RFC 1950, IE还没有正确的实现该标准,还不能处理zlib格式。</p>
<p>&nbsp; &nbsp; Delphi 使用 ZLib 压缩和解压 GZip:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)"> System.ZLib;

</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
ZLIB_GZIP_WINDOWBITS    </span>= <span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">;
ZLIB_DEFLATE_WINDOWBITS </span>= <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TZLibCompressionLevel </span>=<span style="color: rgba(0, 0, 0, 1)"> TZCompressionLevel;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ 使用 ZLib 压缩流</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="Source"&gt;要压缩的数据流&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="Dest"&gt;压缩后的数据流&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="Level"&gt;压缩级别&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="GZipFormat"&gt;是否使用 GZip 压缩算法&lt;/param&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ZLibCompressStream(Source, Dest: TStream;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> Level: TZLibCompressionLevel =<span style="color: rgba(0, 0, 0, 1)"> zcFastest;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> GZipFormat: Boolean = True); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ 使用 ZLib 解压缩流</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;/summary&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="Source"&gt;要解压的数据流&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="Dest"&gt;解压后的数据流&lt;/param&gt;</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/ &lt;param name="GZipFormat"&gt;是否使用 GZip 压缩算法&lt;/param&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ZLibDecompressStream(Source, Dest: TStream;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> GZipFormat: Boolean = True); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> ZLibCompressStream(Source, Dest: TStream; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Level: TZLibCompressionLevel;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> GZipFormat: Boolean);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
WindowBits: Integer;
Zip: TZCompressionStream;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> GZipFormat <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    WindowBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> ZLIB_GZIP_WINDOWBITS
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
    WindowBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> ZLIB_DEFLATE_WINDOWBITS;

Zip :</span>= TZCompressionStream.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Dest, Level, WindowBits);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    Zip.CopyFrom(Source, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span>
    <span style="color: rgba(0, 0, 255, 1)">FreeAndNil</span><span style="color: rgba(0, 0, 0, 1)">(Zip);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> ZLibDecompressStream(Source, Dest: TStream; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> GZipFormat: Boolean);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
WindowBits: Integer;
UnZip: TDecompressionStream;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> GZipFormat <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    WindowBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> ZLIB_GZIP_WINDOWBITS
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
    WindowBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> ZLIB_DEFLATE_WINDOWBITS;

UnZip :</span>= TDecompressionStream.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Source, WindowBits);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    Dest.CopyFrom(UnZip, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span>
    <span style="color: rgba(0, 0, 255, 1)">FreeAndNil</span><span style="color: rgba(0, 0, 0, 1)">(UnZip);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>&nbsp;</p>
<p></p>
<p></audio></p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">
    <p style="border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 5px; padding-right: 10px; padding-bottom: 10px; padding-left: 60px; background: url(&quot;https://images.cnblogs.com/cnblogs_com/lloydsheng/239039/o_copyright.gif&quot;) #e5f1f4 no-repeat 1% 50%; font-family: 微软雅黑; font-size: 11px" id="PSignature">
      <br>作者:
      oldfarmer
      <br>出处:
      http://www.cnblogs.com/rtcmw/
      <br> 欢迎探讨交流 DELPHI 相关技术,QQ:64445322 QQ群:734515869
      <br>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。</p>
</div>
<div>

</div><br><br>
来源:https://www.cnblogs.com/rtcmw/p/12863055.html
頁: [1]
查看完整版本: Delphi 使用 ZLib 压缩和解压 GZip