【问题标题】:Best .NET Framework compression class?最好的 .NET Framework 压缩类?
【发布时间】:2011-02-17 16:17:53
【问题描述】:

是的,我知道 GZipStream 或 DeflateStream 是 .NET Framework 中处理压缩/解压缩的常用方法。

我希望在我的程序中有压缩/解压缩功能,但是

  1. 我希望有一个 .NET Framework C#,而不是第 3 方开源。由于我的程序中有版权限制,我无法使用。

  2. GZipStream 和 DeflateStream 不太好。例如,GZipStream 将文件压缩到 480KB,而 7Zip 将同一文件压缩到 57KB。

微软还有其他好的压缩方法吗???

谢谢

【问题讨论】:

  • 感谢您的所有回复。请问DeflateStream是否使用了霍夫曼编码?
  • DeflateStreamGZipStream 都使用 LZ77 算法和 Huffman 编码的组合(请参阅 msdn.microsoft.com/en-us/library/…msdn.microsoft.com/en-us/library/…)。 Deflate 是纯压缩算法,而GZipStream 包含一个 CRC 校验和,可以通过编写不同的压缩算法来扩展(当前的 .net 框架只实现了一种压缩算法)。

标签: c# compression


【解决方案1】:

GZipStream 和 DeflateStream 专门用于压缩,而不是用于存储的一般文件压缩。

除了这些类之外,.NET 中没有内置压缩。如果您想要高质量的压缩,您将不得不去第三方库。查看 http://www.7-zip.org/sdk.html 获取开源 7zip 库。

【讨论】:

  • 网页上写着“LZMA SDK 被放置在公共领域”这应该意味着它可以随意使用,不是吗?
  • Dave 指出了正确的方向,但 Stefan 提供了 7zip 算法(即 lzma)的现成可用 .Net 实现的链接。
  • 绝对,对所有人免费。 OP 说他不想要“第三方开源”。如果成本不是问题,我不确定是什么。
  • 只是想和未来的人分享; C# 有 ZipArchive 类。如果与最佳压缩选项一起使用,您也可能会得到很好的结果。
【解决方案2】:

7zip 有一个托管包装器。许可证是 LGPL,因此您可以在封闭源代码项目中使用它。我不知道这是否符合您的许可要求,因为您没有说明。

http://sevenzipsharp.codeplex.com/

【讨论】:

    【解决方案3】:

    我没有任何关于压缩率的统计数据,但多年来我一直在使用 SharpZipLib 库并取得了很大的成功。

    【讨论】:

      【解决方案4】:

      好吧,我尝试像递归数据一样压缩,很有趣。检查我的例子:

      private byte[] CompressWithLevels(byte[] data)
      {
          using(MemoryStream ms = new MemoryStream())
          {
              using(GZipStream gz = new GZipStream(ms, CompressionMode.Compress))
              {
                  gz.Write(data, 0, data.Length);
                  return ms.ToArray();
              }
          }
      }
      

      现在,我尝试压缩一个太大的文件,例如:

      string path = @"c:\test.bin";
      byte[] buffer = File.ReadAllBytes(path);
      byte[] level1 = CompressWithLevels(buffer);
      byte[] level2 = CompressWithLevels(level1);
      

      检查缓冲区的大小,level1 和 level2。
      缓冲区大小为 77683,level1 = 57354 和 level2 = 8202...

      缓冲为 100%,则:
      57354 是 73,83%
      8202 为 10,55%
      太搞笑了。

      【讨论】:

      • 这很有趣......它会倒退吗?有什么限制?
      【解决方案5】:

      您还可以将开源 ZLib (http://www.zlib.net/) 与 PInvoke 一起使用,或者对其使用包装器(我使用过 zlib.net - http://www.componentace.com/zlib_.NET.htm - 但我相信它有一些错误)。 它不如托管库方便,但比 DeflateStream/GZipStream 更有效(除了 GZipStream 中的额外 CRC 之外,它们是相同的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多