Csharp/C#教程:Zlib兼容的压缩流?分享


Zlib兼容的压缩流?

System.IO.Compression.GZipStream或System.IO.Compression.Deflate与zlib压缩兼容吗?

从MSDN关于System.IO.Compression.GZipStream:

此类表示gzip数据格式,该格式使用行业标准算法进行无损文件压缩和解压缩。

来自zlib FAQ :

另一方面,zlib中的gz *函数使用gzip格式。

所以zlib和GZipStream应该可以互操作,但前提是你使用zlib函数来处理gzip格式。

据报道,System.IO.Compression.Deflate和zlib不可互操作。

如果您需要处理zip文件(您可能不需要,但其他人可能需要),您需要使用SharpZipLib或其他第三方库。

DotNetZip包括一个DeflateStream,一个ZlibStream和一个GZipStream,用于处理RFC 1950,1951和1952.所有这些都使用DEFLATE算法,但每个算法的成帧和头字节都不同。

作为一个优点,DotNetZip中的流没有表现出针对内置流报告的在压缩下扩展数据大小的exception 。 此外,没有内置的ZlibStream,而DotNetZip为您提供了与zlib的良好互操作。

我用Git对象遇到了这个问题。 在这种特殊情况下,它们将对象存储为具有Zlib头的缩小blob,这在RFC 1950中有记录 。 您可以通过创建包含以下内容的文件来创建兼容的blob:

  • C# DeflateStream的输出
  • Adler32校验和输入数据到DeflateStream ,big-endian格式(MSB优先)
  • 我做了自己的Adler实现

     public class Adler32Computer { private int a = 1; private int b = 0; public int Checksum { get { return ((b * 65536) + a); } } private static readonly int Modulus = 65521; public void Update(byte[] data, int offset, int length) { for (int counter = 0; counter < length; ++counter) { a = (a + (data[offset + counter])) % Modulus; b = (b + a) % Modulus; } } } 

    这就是它。

    我已经使用GZipStream来压缩.NET XmlSerializer的输出,并且使用gunzip(在cygwin中),winzip和另一个GZipStream解压缩结果非常好。

    作为参考,这是我在代码中所做的:

     FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress)) { XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); serializer.Serialize(gzStream, myData); } 

    然后,在c#中解压缩

     FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); using (Stream input = new GZipStream(fs, CompressionMode.Decompress)) { XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); myData = (MyDataType) serializer.Deserialize(input); } 

    使用cygwin中的’file’实用程序可以发现,使用GZipStream和GNU GZip压缩的同一文件确实存在差异(可能是其他人在此主题中声明的头信息)。 然而,这种差异在实践中似乎无关紧要。

    gzip是deflate +一些页眉/页脚数据,比如校验和和长度等。所以它们不兼容,因为一种方法可以使用另一种方法的流,但它们使用相同的压缩算法。

    它们只是使用zlib或deflate算法压缩数据,但不提供某些特定文件格式的输出。 这意味着如果您将流按原样存储到硬盘驱动器中,很可能您将无法使用某些应用程序(gzip或winrar)打开它,因为文件头(幻数等)不包含在流中您应该自己写。

    从.NET Framework 4.5开始, System.IO.Compression.DeflateStream类使用zlib库。

    从该课程的MSDN文章 :

    此类表示Deflate算法,该算法是无损文件压缩和解压缩的行业标准算法。 从.NET Framework 4.5开始,DeflateStream类使用zlib库。 因此,它提供了更好的压缩算法,并且在大多数情况下,它提供的压缩文件比早期版本的.NET Framework中提供的压缩文件小。

    我同意andreas。 您可能无法在外部工具中打开该文件,但如果该工具需要流,您可以使用它。 您还可以使用相同的压缩类来回退文件。

    上述就是C#学习教程:Zlib兼容的压缩流?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

    本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

    ctvol管理联系方式QQ:251552304

    本文章地址:https://www.ctvol.com/cdevelopment/1014113.html

    (0)
    上一篇 2021年12月30日
    下一篇 2021年12月30日

    精彩推荐