我需要 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 个额外字节。
如果需要,我可以分享代码。但是,它取自您在网上看到的标准示例,代码没有什么特别之处。
我错过了什么吗?有没有办法解决它?如果页眉和页脚始终保持不变,也许我总是可以添加额外的字节。问候。
最佳答案
首先,您需要了解 zlib 可以生成三种可能的格式。它们是 raw deflate (RFC 1951)、一个 zlib 流,它是包装在 zlib header 和尾部 (RFC 1950) 中的 raw deflate,以及一个 gzip 流,它是包装在 gzip header 和尾部 (RFC 1952) 中的原始 deflate。您的 C# 代码正在生成原始 deflate 流,而您的 C 代码正在生成 zlib 流。
您还没有显示您的代码,但您可以轻松地使用 zlib(在您的 C 代码中)生成原始 deflate 流,如 DeflateStream
做。不幸的是,NET 4.5 中没有生成 zlib 流的类(在您的 C# 代码中)。但是,您可以轻松创建自己的 zlib header 和预告片来包装原始 deflate 流。 (参见 RFC。)
但是,我强烈建议您根本不要使用 NET 4.5 zlib 接口(interface)例程。使用DotNetZip相反,它为 zlib 的全部功能提供了一个接口(interface),以及更多,最重要的是没有像微软所说的 NET 4.5 中的错误 will not fix !
关于.NET DeflateStream 与 linux zlib 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845440/