最佳的.NET Framework压缩类是什么?

8

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

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

  1. 我需要一个.NET Framework C#的方法,不是第三方开源。由于版权限制,我不能在程序中使用第三方开源方法。

  2. GZipStream和DeflateStream并不是很好用。例如,GZipStream将一个文件压缩到480KB,而7Zip将相同的文件压缩到57KB。

Microsoft是否有其他好的压缩方法?

谢谢


感谢您所有的回复。我可以问一下DeflateStream是否使用了霍夫曼编码吗? - Jack
1
DeflateStreamGZipStream都使用LZ77算法和霍夫曼编码的组合(请参见http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx和http://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx)。 Deflate是纯压缩算法,而GZipStream包括CRC校验和可以通过编写不同的压缩算法进行扩展(当前的.NET框架只实现了一个压缩算法)。 - Philip Daubmeier
5个回答

6
和是专为压缩而设计的,而不是用于文件存储的一般压缩。

除了这些类之外,.NET没有内置的压缩功能。如果你需要高质量的压缩,你必须使用第三方库。请查看http://www.7-zip.org/sdk.html,这里有一个开源的7zip库。


网页陈述了“LZMA SDK放置在公共领域”的声明,这意味着它可以自由使用,不是吗? - Jens Granlund
Dave指出了正确的方向,但Stefan提供了7zip算法(即lzma)的现成.Net实现的链接。 - Oliver
完全免费。原帖作者表示不想要“第三方开源”。如果成本不是问题,我不确定还有什么问题。 - Dave Swersky
只是想和未来的人分享一下:C#有ZipArchive类。如果使用最佳压缩选项,您可能也会得到很好的结果。 - Sal

2

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

http://sevenzipsharp.codeplex.com/


1

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


1

嗯,我尝试像递归数据一样压缩,感觉很有趣。看看我的例子:

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%
太有趣了。


那很有趣...它可以倒着走吗?限制是什么? - 8vtwo

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接