System.IO.Compression.GZipStream或System.IO.Compression.Deflate是否与zlib压缩兼容?
答案 0 :(得分:14)
DotNetZip包括一个DeflateStream,一个ZlibStream和一个GZipStream,用于处理RFC 1950,1951和1952.所有这些都使用DEFLATE算法,但每个的成帧和头字节都不同。
作为一个优势,DotNetZip中的流不会出现针对内置流报告的anomaly of expanding data size压缩状态。此外,没有内置的ZlibStream,而DotNetZip为您提供了与zlib良好的互操作性。
答案 1 :(得分:13)
我用Git对象遇到了这个问题。在这种特殊情况下,它们将对象存储为带有Zlib头的缩小blob,这在RFC 1950中有记录。您可以通过创建包含以下内容的文件来生成兼容的blob:
0x78 0x01
CM
= 8 = deflate CINFO
= 7 = 32Kb窗口FCHECK
= 1 =此标头的校验和位DeflateStream
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;
}
}
}
这就是它。
答案 2 :(得分:9)
来自MSDN关于System.IO.Compression.GZipStream:
此类表示gzip数据格式,该格式使用行业标准算法进行无损文件压缩和解压缩。
来自zlib FAQ:
另一方面,zlib中的gz *函数使用gzip格式。
所以zlib和GZipStream应该是可互操作的,但前提是你使用zlib函数来处理gzip格式。
据报道,System.IO.Compression.Deflate和zlib无法互操作。如果您需要处理zip文件(您可能不需要,但其他人可能需要),您需要使用SharpZipLib或其他第三方库。
答案 3 :(得分:6)
我已经使用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压缩的同一文件确实存在差异(可能是其他人在此主题中声明的头信息)。然而,这种差异似乎在实践中并不重要。
答案 4 :(得分:3)
gzip是deflate +一些页眉/页脚数据,如校验和和长度等。所以它们在一种方法可以使用另一种方法的流的意义上是不兼容的,但它们使用相同的压缩算法。 / p>
答案 5 :(得分:2)
他们只是使用zlib或deflate算法压缩数据,但不提供某些特定文件格式的输出。这意味着如果您按原样将流存储到硬盘驱动器,很可能您将无法使用某些应用程序(gzip或winrar)打开它,因为文件头(幻数等)不包含在流中您应该自己写。
答案 6 :(得分:1)
从.NET Framework 4.5开始,System.IO.Compression.DeflateStream
类使用zlib库。
来自班级的MSDN article:
此类表示Deflate算法,该算法是无损文件压缩和解压缩的行业标准算法。从.NET Framework 4.5开始,DeflateStream类使用zlib库。因此,它提供了更好的压缩算法,并且在大多数情况下,它提供的压缩文件比早期版本的.NET Framework中提供的压缩文件小。
答案 7 :(得分:0)
我同意andreas。您可能无法在外部工具中打开该文件,但如果该工具需要流,您可以使用它。您还可以使用相同的压缩类来回退文件。