<p>确实<code>zlib</code>压缩是gzip兼容的,正如python <a href="https://docs.python.org/3/library/zlib.html" rel="nofollow noreferrer">stdlib documentation</a>所提到的。这是因为zlib和gzip都使用<code>deflate</code>压缩标准</p>
<p><code>zlib</code>生成原始的deflate压缩字节流。另一方面<code>gzip</code>是单次压缩的标准,它将压缩流包裹在放气上。因此,如果从gzip文件中去掉文件头,可以使用原始deflate库进行解压缩</p>
<p>字符串<code>This is the raw string</code>的<code>zlib</code>压缩流如下所示</p>
<pre><code>>>> import zlib
>>> data = bytes(str("This is the raw string"), encoding="utf-8")
>>> res = zlib.compress(data)
>>> print(res)
b'x\x9c\x0b\xc9\xc8,V\x00\xa2\x92\x8cT\x85\xa2\xc4r\x85\xe2\x92\xa2\xcc\xbct\x00ZI\x08\x17'
</code></pre>
<p>这是(当您将其发送到<code>xxd</code>时)</p>
<pre><code>00000000: 789c 0bc9 c82c 5600 a292 8c54 85a2 c472 x....,V....T...r
00000010: 85e2 92a2 ccbc 7400 5a49 0817 ......t.ZI..
</code></pre>
<p>前2个字节声明文件的类型</p>
<pre><code>78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression
</code></pre>
<p>在我们的例子中,它是<code>78 9C</code>,它是zlib,带有默认压缩,这是python在其文档中所说的</p>
<pre><code>file package.gz
</code></pre>
<p>它应该是<code>zlib compressed data</code>,因为这就是文件头的样子</p>
<p>如果我们尝试使用gzip进行压缩,让我们看看会出现什么</p>
<pre><code>>>> import gzip
>>> data = bytes(str("This is the raw string"), encoding="utf-8")
>>> gzip.compress(data)
b'\x1f\x8b\x08\x00\xd6\x1bw_\x02\xff\x0b\xc9\xc8,V\x00\xa2\x92\x8cT\x85\xa2\xc4r\x85\xe2\x92\xa2\xcc\xbct\x00&\x91\x1a\x82\x16\x00\x00\x00'
</code></pre>
<p>如果你注意到十六进制转储</p>
<pre><code>00000000: 1f8b 0800 d61b 775f 02ff 0bc9 c82c 5600 ......w_.....,V.
00000010: a292 8c54 85a2 c472 85e2 92a2 ccbc 7400 ...T...r......t.
00000020: 2691 1a82 1600 0000 &.......
</code></pre>
<p>神奇的数字显示为:<code>1f 8b</code>(<a href="https://en.wikipedia.org/wiki/Gzip" rel="nofollow noreferrer">wiki</a>)。如果您查看头部,您将看到两个十六进制转储包含相同的压缩数据,这是
对于zlib</p>
<pre><code>00000000: .... 0bc9 c82c 5600 a292 8c54 85a2 c472 x....,V....T...r
00000010: 85e2 92a2 ccbc 7400 .... .... ......t.ZI..
</code></pre>
<p>还有,对于gzip</p>
<pre><code>00000000: .... .... .... .... .... 0bc9 c82c 5600 ......w_.....,V.
00000010: a292 8c54 85a2 c472 85e2 92a2 ccbc 7400 ...T...r......t.
00000020: .... .... .... .... &.......
</code></pre>
<p>因此,如果你<a href="https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=19ba2478bd248f825f755eeecdf25c07" rel="nofollow noreferrer">ask rust to use the correct decoder</a>,它肯定会起作用。这就是标准的好处</p>
<p>因此,gzip只是zlib容器上的一个容器,我没有解释hextump中其他字节的含义(因为我还没有查找它)</p>