System.IO.Compression.DeflateStream 的数据格式

Data format for System.IO.Compression.DeflateStream

我需要能够使用 PowerShell 压缩数据流,并使用我的 C 程序使用 zlib 对其进行解压缩。

我在 PowerShell 中使用 System.IO.Compression.DeflateStream 进行压缩,但在我的 C 程序中使用 zlib 解压不起作用。

显然 DeflateStream 向输出添加了额外的 data/header。如果是这样,我想知道它的格式,以便我可以用 zlib 实现解压缩。

回答我自己的问题,其实恰恰相反。

System.IO.Compression.DeflateStream 不添加任何额外数据,它输出没有 header/metadata.

的原始压缩流

我实际上必须将 ZLib header 添加到流中。参见 RFC 1950

这个回答对我也有帮助:

What does a zlib header look like?

具体来说,一个zlib中必须有两个字节header:

0   1
+---+---+
|CMF|FLG|
+---+---+

第一个字节(CMF):

第一个字节的每个半字节(half-byte)都有一个含义:

bits 0 to 3  CM     Compression method
bits 4 to 7  CINFO  Compression info

你可以在我上面提到的答案中看到更详细的内容。

第二个字节(FLG):

FLG(FLaGs)这个标志字节划分如下:

bits 0 to 4  FCHECK  (check bits for CMF and FLG)
bit  5       FDICT   (preset dictionary)
bits 6 to 7  FLEVEL  (compression level)

最常见的 header 是:

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression

我在 System.IO.Compression.DeflateStream 的输出之前添加了 header 78 9C,但是正如@Mark Adler 在评论中所说的那样,还有一个步骤:我们必须添加一个 Adler -32 校验和在流的末尾。

编辑:

最后,我想重新发明轮子。我可以在 PowerShell 压缩中使用 System.IO.Compression.GZipStream,在解压中使用 inflateInit2(),一切都应该没问题(感谢@Mark Adler 的建议)。