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 的建议)。
我需要能够使用 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 的建议)。