.NET DeflateStream 与 linux zlib 的区别

标签 .net compression zlib

我需要 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/

相关文章:

c++ - zlib - 提取大条目

c++ - 如何将 zlib 添加到现有的 qt 安装

c# - 如何为DataGridview RowHeader设置Header?

c# - 使用 ThreadPool.QueueUserWorkItem 和使用 System.Thread 有什么区别?

c# - Kadane 的算法找到具有最大总和的子数组

c# - 如何从文件字节开始在内存中创建一个 zip 文件?

algorithm - 连续分数项的良好压缩方案?

C# HttpWebRequest - 使用 Gzip 压缩

c++ - 在不读取下一个字节的情况下解压缩连接的 zlib 流

c# - 清除 Web 浏览器控制所有站点的 cookie,而不清除 IE 本身