我需要能够用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/