.net System.IO.Compression.DeflateStream的数据格式
我需要能够用PowerShell压缩数据流,并用我的C程序用zlib解压它 我在PowerShell中使用.net System.IO.Compression.DeflateStream的数据格式,.net,c,powershell,zlib,.net,C,Powershell,Zlib,我需要能够用PowerShell压缩数据流,并用我的C程序用zlib解压它 我在PowerShell中使用System.IO.Compression.DeflateStream进行压缩,但是在我的C程序中使用zlib进行解压缩不起作用 显然,DeflateStream向输出中添加了额外的数据/标题。如果是这样的话,我想知道它的格式,这样我就可以用zlib实现解压。回答我自己的问题,事实恰恰相反 System.IO.Compression.DeflateStream不添加任何额外的数据,它输出一个
System.IO.Compression.DeflateStream
进行压缩,但是在我的C程序中使用zlib进行解压缩不起作用
显然,
DeflateStream
向输出中添加了额外的数据/标题。如果是这样的话,我想知道它的格式,这样我就可以用zlib实现解压。回答我自己的问题,事实恰恰相反
System.IO.Compression.DeflateStream
不添加任何额外的数据,它输出一个没有头/元数据的原始deflate流
实际上,我必须将ZLib头添加到流中。看
这个答案也帮助了我:
具体而言,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
我在System.IO.Compression.DeflateStream
的输出之前添加了标题78 9C
,但正如@Mark Adler在评论中所说的,还有一个步骤:我们必须在流的末尾添加一个Adler-32校验和
编辑:
最后,我试图重新发明轮子。我可以在PowerShell压缩中使用
System.IO.Compression.GZipStream
,在解压缩中使用inflateInit2()
,一切都应该正常(感谢@Mark Adler的建议)。如果不在最后添加检查值,它就不能“像个魔咒一样工作”<代码>充气()将不会返回Z\u STREAM\u END
,如果没有该选项,则表示成功。如果只接受Z_OK
,您将不知道流是否不完整。无论如何,您不需要在zlib头中添加。您可以使用inflateInit2()
请求原始充气,在这种情况下,如果完成,它将返回Z\u STREAM\u END
。我还建议您使用GZipStream
来提供正确的完整性检查包装。您可以使用inflateInit2()
请求gzip解码。@MarkAdler很高兴直接听到zlib/gzip的创建者的声音。完全错了,我很快就会改变这个答案。谢谢