C# Zlib兼容的压缩流?

C# Zlib兼容的压缩流?,c#,compression,zlib,C#,Compression,Zlib,System.IO.Compression.GZipStream或System.IO.Compression.Deflate是否与zlib压缩兼容?它们仅使用zlib或Deflate算法压缩数据,但不提供某些特定文件格式的输出。这意味着,如果您将流按原样存储到硬盘驱动器,您很可能无法使用某些应用程序(gzip或winrar)打开它,因为流中不包括文件头(幻数等),您应该自己编写它们。它们只是使用zlib或deflate算法压缩数据,但不提供某些特定文件格式的输出。这意味着,如果您将流按原样存储到

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

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

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

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

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

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

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

来自about System.IO.compression.GZipStream:

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

从:

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

因此,zlib和GZipStream应该是可互操作的,但前提是使用zlib函数来处理gzip格式

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

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

来自about System.IO.Compression.GZipStream:

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

从:

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

因此,zlib和GZipStream应该是可互操作的,但前提是使用zlib函数来处理gzip格式

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


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

我使用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中解压#


在cygwin中使用“file”实用程序表明,使用GZipStream压缩的同一文件与使用GNU GZip压缩的同一文件之间确实存在差异(可能与其他线程中所述的头信息相同)。然而,这种差异在实践中似乎并不重要。

我使用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中解压#

在cygwin中使用“file”实用程序表明,使用GZipStream压缩的同一文件与使用GNU GZip压缩的同一文件之间确实存在差异(可能与其他线程中所述的头信息相同)。然而,这种差异在实践中似乎并不重要。

包括DeflateStream、ZlibStream和GZipStream,用于处理RFC1950、1951和1952。所有文件都使用DEFLATE算法,但每个文件的帧和头字节都不同

作为一个优势,DotNetZip中的流不会显示针对内置流报告的欠压缩。此外,没有内置的ZlibStream,而DotNetZip为您提供了这一功能,以便与zlib进行良好的互操作

包括DeflateStream、ZlibStream和GZipStream,用于处理RFC1950、1951和1952。所有文件都使用DEFLATE算法,但每个文件的帧和头字节都不同


作为一个优势,DotNetZip中的流不会显示针对内置流报告的欠压缩。此外,没有内置的ZlibStream,而DotNetZip为您提供了这一功能,以便与zlib进行良好的互操作

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

  • 两个头字节(RFC1950中的CMF和FLG),值为
    0x78 0x01
    • CM
      =8=放气
    • CINFO
      =7=32Kb窗口
    • FCHECK
      =1=此标头的校验和位
  • C#
    DeflateStream的输出
  • 将输入数据的Adler32校验和转换为
    DeflateStream
    ,大端字节格式(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;
        }
    }
}
公共类Adler32计算机
{
私人INTA=1;
私有int b=0;
公共整数校验和
{
得到
{
返回((b*65536)+a);
}
}
专用静态只读整数模=65521;