Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net System.IO.Compression.DeflateStream的数据格式_.net_C_Powershell_Zlib - Fatal编程技术网

.net System.IO.Compression.DeflateStream的数据格式

.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不添加任何额外的数据,它输出一个

我需要能够用PowerShell压缩数据流,并用我的C程序用zlib解压它

我在PowerShell中使用
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的创建者的声音。完全错了,我很快就会改变这个答案。谢谢