Ben*_*ins 13 c# compression zlib
System.IO.Compression.GZipStream或System.IO.Compression.Deflate与zlib压缩兼容吗?
小智 16
我用Git对象遇到了这个问题.在这种特殊情况下,它们将对象存储为带有Zlib头的缩小blob,这在RFC 1950中有记录.您可以通过创建包含以下内容的文件来创建兼容的blob:
0x78 0x01
CM = 8 =放气CINFO = 7 = 32Kb窗口FCHECK = 1 =此标头的校验和位DeflateStreamDeflateStreambig-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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是它.
从MSDN关于System.IO.Compression.GZipStream:
这个类代表gzip的数据格式,它采用无损文件压缩和解压的行业标准算法.
来自zlib FAQ:
另一方面,zlib中的gz*函数使用gzip格式.
所以zlib和GZipStream应该可以互操作,但前提是你使用zlib函数来处理gzip格式.
据报道,System.IO.Compression.Deflate和zlib不可互操作.
如果您需要处理zip文件(您可能不需要,但其他人可能需要),您需要使用SharpZipLib或其他第三方库.
我已经使用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);
}
Run Code Online (Sandbox Code Playgroud)
然后,在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);
}
Run Code Online (Sandbox Code Playgroud)
使用cygwin中的'file'实用程序可以发现,使用GZipStream和GNU GZip压缩的同一文件确实存在差异(可能是其他人在此主题中声明的头信息).然而,这种差异在实践中似乎无关紧要.