是的系统。IO.压缩。GZipStream或系统。IO.压缩。放兼容zlib compression?

有帮助吗?

解决方案

MSDN 关于系统。IO.压缩。GZipStream:

这类表示的gzip数据格式,它利用一个行业标准算法的无损的文件压缩和解压。

zlib常见问题:

Gz*功能在zlib另一方面使用的gzip格式。

所以zlib和GZipStream应该是可互操作,但仅仅如果您使用的zlib的功能用于处理gzip-格式。

系统。IO.压缩。放和zlib据报是不可互操作的。

如果你需要压缩文件处理(你可能不,但是其他人可能需要的此)需要使用 SharpZipLib 或另一第三方图书馆。

其他提示

DotNetZip 包括DeflateStream,ZlibStream和GZipStream,以处理RFC1950年,于1951年和1952年。所有使用压缩算法的,但本框架和头字节不同,对每一个。

作为一个优点,流DotNetZip不会出现的 异常的扩大数据的尺寸 下压缩报告的内流。此外,没有内在的ZlibStream,而DotNetZip给你的,对于良好的互操作与zlib.

我遇到这个问题}类对象。在这一特定情况下,他们储存的目的,作为泄气的斑点有Zlib头,这是记录在案 RFC1950年.你可以做一个兼容blob通过制作文件,该文件包含:

  • 两头字节(家庭和妇女国家发展中心和FLG从RFC1950)的价值 0x78 0x01
    • CM =8=放气
    • CINFO =7=32Kb窗口
    • FCHECK =1=校位于这个头
  • 输出的C# DeflateStream
  • 一个Adler32校验的输入数据 DeflateStream, big-endian格式(优先)

我做我自己的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压缩输出来的。净序列化程序和它的工作完全没压缩的结果与gunzip(在cygwin),因而另一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显示,确有差别的同一文件压缩与GZipStream和与GNU GZip(可能是头信息,如其他人已经指出,在这个螺纹)。这种差异,但是,似乎不论在实践。

gzip是放气+某些头/脚的数据,像一个检验和长度等。所以他们不兼容,在这个意义上,一个方法可以使用流从其他的,但他们采用相同的压缩算法。

他们只是压缩的数据使用zlib或压缩算法,但是不提供的产出用于一些特定文件格式。这意味着,如果你存放的流-是的硬盘驱动器,最有可能你会不能够打开它使用的一些应用程序(gzip或压缩),因为文件的标题(魔术的人数,等等)不包含在流一个你应该写他们自己。

从。净框架4.5的 System.IO.Compression.DeflateStream 类使用zlib library.

从类的 MSDN文章:

这类表示的紧缩算法,这是一个行业标准算法的无损的文件压缩和解压。开始的。净框架4.5,DeflateStream类使用zlib library.结果,它提供了一个更好的压缩算法,在大多数情况下,较小的压缩的文件比它提供了在早期版本的.净框架。

我同意安德烈亚斯。你可能不能打开文件,在一个外部工具,但如果该工具预计流你可能可以使用它。你也可以放文件使用相同的压缩类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top