.NET DeflateStream 与 linux zlib 的区别

.NET DeflateStream vs linux zlib difference

我需要 Windows 和 Ubuntu 之间的跨平台 compression/decompression。据我了解,从 .NET 4.5 开始,class DeflateStream 使用 zlib 作为压缩库。我写了两个压缩数据的小测试程序,一个用C# 运行 on Windows,另一个用'C' 运行 on 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 个额外字节。

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

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

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

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

首先,您需要了解 zlib 可以生成三种可能的格式。它们是 raw deflate (RFC 1951),一个 zlib 流,它是 raw deflate 包裹在 zlib header 和 trailer (RFC 1950),以及一个 gzip 流,它是原始 deflate 包裹在 gzip header 和预告片(RFC 1952)。您的 C# 代码正在生成原始 deflate 流,而您的 C 代码正在生成 zlib 流。

您没有显示您的代码,但您可以轻松地使用 zlib(在您的 C 代码中)来生成原始压缩流,就像 DeflateStream 所做的那样。不幸的是,NET 4.5 中没有 class 来生成 zlib 流(在您的 C# 代码中)。但是,您可以轻松创建自己的 zlib header 和预告片来包装原始压缩流。 (参见 RFC。)

但是我强烈建议您根本不要使用 NET 4.5 zlib 接口例程。使用 DotNetZip instead, which provides an interface to the full functionality of zlib, and more, and most importantly does not have bugs like in NET 4.5 that Microsoft has said that they will not fix!