【问题标题】:.NET DeflateStream vs linux zlib difference.NET DeflateStream 与 linux zlib 的区别
【发布时间】:2016-06-15 20:45:38
【问题描述】:

我需要在 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 个额外字节。

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

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

【问题讨论】:

    标签: .net compression zlib


    【解决方案1】:

    首先,您需要了解 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 用于避免 MS 实现。 .NET GZipStream 有一个错误,它无法处理具有多个 gzip 流的文件;它只解压缩第一个流。
    • 从 .NET 6 开始有一个ZLibStream
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多