我需要能够用PowerShell压缩数据流,并使用zlib用我的C程序解压缩它。
我正在使用System.IO.Compression.DeflateStream在PowerShell中进行压缩,但是在我的C程序中使用zlib解压缩不起作用。
显然,DeflateStream向输出添加了额外的数据/头。如果是这样的话,我想知道它的格式,这样我就可以用zlib实现解压缩。
发布于 2016-10-09 04:40:58
回答我自己的问题,其实正好相反。
System.IO.Compression.DeflateStream不添加任何额外的数据,它输出一个没有头/元数据的原始放气流。
实际上,我必须将ZLib头添加到流中。见RFC 1950。
这个答案也帮助了我:
详细地说,zlib头中必须有两个字节:
0 1
+---+---+
|CMF|FLG|
+---+---+第一个字节(CMF):
第一个字节的每一个小字节(半字节)都有一个含义:
bits 0 to 3 CM Compression method
bits 4 to 7 CINFO Compression info您可以在我前面提到的答案中看到更详细的内容。
二字节(FLG):
FLG (标志)此标志字节按以下方式划分:
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-32校验和。
编辑:
最后,我试图重新发明轮子。我可以在System.IO.Compression.GZipStream压缩中使用PowerShell,在解压缩中只使用inflateInit2(),一切都应该可以(感谢@Mark的建议)。
https://stackoverflow.com/questions/39939869
复制相似问题