.NET DeflateStream vs linux zlib difference



我需要Windows和Ubuntu之间的跨平台压缩/解压缩。据我了解,启动.NET 4.5,类FeflateStream使用Zlib作为压缩库。我已经编写了两个小型测试程序来压缩数据,一个在Windows上运行的C#中,另一个在Ubuntu上运行的" C"。.NET平台为4.5.2。

c#代码使用compressionLevel.optimal

C代码使用z_best_compression

这是结果:

Input bytes: {9, 12, 13}
C# output: {227, 228, 225, 5, 0};
C output:  {120, 218, 227, 228, 225, 5, 0, 0, 67, 0, 35}

您可以看到,C#中压缩数据的长度为5个字节,其中c中的c为11个字节。似乎" C" Zlib在标题中添加了2个额外的字节,并且在页脚中添加了4个额外的字节。

如果需要,我可以共享代码。但是,它是从您在网上看到的标准示例中取出的,并且代码没有什么特别的。

我想念什么吗?有没有办法修复它?如果标题和页脚始终保持不变,也许我总是可以添加其他字符。问候。

首先,您需要了解Zlib可以生成的三种可能的格式。它们是原始的Deflate(RFC 1951),是用Zlib标头和拖车包裹的原始气流(RFC 1950)的原始气流,以及GZIP流中的GZIP流,该流是用GZIP头和拖车包裹的原始放气(RFC 1952)。您的C#代码正在生成原始的气流流,而您的C代码正在生成Zlib流。

您尚未显示您的代码,但是您可以像DeflateStream一样轻松地使用Zlib(在C代码中)生成原始Deflate流。不幸的是,Net 4.5中没有类ZLIB流(在您的C#代码中)。但是,您可以轻松地创建自己的Zlib标头和预告片,以包装原始的Deflate流。(请参阅RFC。)

但是,我强烈建议您根本不使用NET 4.5 ZLIB接口例程。代替使用dotnetzip,它为Zlib的完整功能提供了一个接口,并且最重要的是,Microsoft所说的NET 4.5中没有错误的错误!

事实证明,这是deflateStream和zlib之间的一个非常古老的不相容性问题,如下所述:https://tlzprgmr.wordpress.com/2010/2010/03/03/net-deflatestreamzlib-compatibility/

本质上,DeflateStream不会将所需的标头或页脚添加到压缩数据中。问候。

最新更新