.NET DeflateStream vs linux zlib的区别

时间:2016-06-15 20:45:38

标签: .net compression zlib

我需要Windows和Ubuntu之间的跨平台压缩/解压缩。据我所知,从.NET 4.5开始,类DeflateStream使用zlib作为压缩库。我编写了两个小的测试程序来压缩数据,一个在C#上运行在Windows上,另一个在'C'上运行在Ubuntu上。 .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为11个字节。似乎'C'zlib在页眉中添加了2个额外字节,在页脚中添加了4个额外字节。

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

我错过了什么吗?有办法解决吗?如果页眉和页脚总是保持不变,也许我总是可以添加额外的字节。问候。

2 个答案:

答案 0 :(得分:5)

首先,您需要了解zlib可以生成三种可能的格式。它们是原始deflate(RFC 1951),一个zlib流,它是一个包含在zlib头和尾部(RFC 1950)中的原始deflate,以及一个gzip流,它是一个包含在gzip头和尾部(RFC 1952)中的原始deflate。您的C#代码正在生成原始deflate流,而您的C代码正在生成zlib流。

您尚未显示您的代码,但您可以轻松使用zlib(在C代码中)生成原始deflate流,如DeflateStream所示。不幸的是,.NET 4.5中没有类来生成zlib流(在您的C#代码中)。但是,您可以轻松创建自己的zlib标头和预告片以包装原始deflate流。 (参见RFC。)

但是我强烈建议您不要使用.NET 4.5 zlib接口例程。请改用DotNetZip,它提供了zlib全部功能的接口等等,最重要的是没有像.NET 4.5那样的错误,微软已经说过他们will not fix

答案 1 :(得分:1)

原来这是DeflateStream和zlib之间的一个非常古老的不兼容问题,如下所述:https://tlzprgmr.wordpress.com/2010/03/17/net-deflatestreamzlib-compatibility/

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