.NET DeflateStream与Linux zlib的区别

4
我需要在Windows和Ubuntu之间进行跨平台压缩/解压缩。据我了解,从.NET 4.5开始,DeflateStream类使用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中为11个字节。看起来'C' zlib在头部添加了2个额外的字节,在尾部添加了4个额外的字节。

如果需要,我可以分享代码。但是,这些代码是从网络上看到的标准示例中获取的,没有什么特别之处。

我是否漏掉了什么?有没有办法解决它?如果头部和尾部始终保持不变,也许我可以始终添加额外的字节。谢谢。

2个回答

8
首先,您需要了解zlib可以生成三种可能的格式。它们是raw deflate(RFC 1951),一个zlib流,它是raw deflate包装在zlib头和尾(RFC 1950)中,以及一个gzip流,它是raw deflate包装在gzip头和尾(RFC 1952)中。您的C#代码正在生成一个raw deflate流,而您的C代码正在生成一个zlib流。
您没有展示您的代码,但是您可以轻松地使用zlib(在您的C代码中)来生成一个raw deflate流,就像DeflateStream一样。不幸的是,在NET 4.5中没有类可以生成一个zlib流(在您的C#代码中)。但是,您可以轻松创建自己的zlib头和尾来包装raw deflate流。 (参见RFC。)
但是我强烈建议您根本不要使用NET 4.5 zlib接口例程。改用DotNetZip,它提供了对zlib完整功能的接口,更重要的是没有像在NET 4.5中那样存在错误,微软已经表示他们不会修复

+1 避免使用微软的实现。.NET GZipStream 存在一个 bug,它无法处理具有多个 gzip 流的文件;它只解压缩第一个流。 - Peter Friend
自从.NET 6推出以来,就有一个ZLibStream - Honza R

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接