我需要能够用PowerShell压缩数据流,并用zlib用我的C程序解压它。
我正在使用PowerShell中的System.IO.Compression.DeflateStream进行压缩,但在我的C程序中使用zlib进行的解压缩不起作用。
显然DeflateStream会在输出中添加额外的数据/头。如果这是对的,我想知道它的格式,这样我就可以用zlib实现解压。

最佳答案

要回答我自己的问题,事实恰恰相反。
System.IO.Compression.DeflateStream不添加任何额外数据,它输出一个没有头/元数据的原始deflate流。
实际上,我必须将ZLib头添加到流中。见RFC 1950
这个答案也帮助了我:
What does a zlib header look like?
具体来说,zlib头中必须有两个字节:

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

第一个字节(CMF):
第一个字节的每个半字节都有一个含义:
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)

最常见的标题是:
78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression

我已经在78 9C输出之前添加了头System.IO.Compression.DeflateStream,但是还有一个步骤@Mark Adler在评论中说:我们必须在流的末尾添加一个Adler-32校验和。
编辑:
最后,我试图重新发明轮子。我可以在PowerShell压缩中使用System.IO.Compression.GZipStream,在解压缩中使用inflateInit2(),一切都应该正常(感谢@Mark Adler的建议)。

关于.net - System.IO.Compression.DeflateStream的数据格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39939869/

10-11 21:13