MSDN文档告诉我以下内容:
GZipStream类使用gzip数据格式,该格式包括用于检测数据损坏的循环冗余校验值.gzip数据格式使用与DeflateStream类相同的压缩算法.
似乎GZipStream在输出中添加了一些额外的数据(相对于DeflateStream).我想知道,在什么类型的场景中使用GZipStream而不是DeflateStream是必不可少的?
Deflate只是压缩算法.GZip实际上是一种格式.
如果您使用GZipStream
压缩文件(并使用扩展名保存.gz
),结果实际上可以由WinZip或gzip
工具等归档程序打开.如果使用a进行压缩DeflateStream
,则这些工具将无法识别该文件.
如果压缩文件设计为由这些工具打开,则必须使用GZipStream
而不是DeflateStream
.
我也认为这是必不可少的,如果你在传输大量数据在不可靠的介质(即互联网连接),而不是使用纠错协议,如TCP/IP.例如,您可能通过串行端口,原始套接字或UDP进行传输.在这种情况下,您肯定需要嵌入GZip格式的CRC信息,以确保数据正确.
GZipStream与DeflateStream相同,但它添加了一些CRC以确保数据没有错误.
好吧,我的第一个答案完全错了.我查看了Mono源代码,发现GZipStream类实际上将其读/写(以及几乎任何其他)调用重定向到对内部DeflateStream对象的方法的适当调用:
public override int Read (byte[] dest, int dest_offset, int count) { return deflateStream.Read(dest, dest_offset, count); } public override void Write (byte[] src, int src_offset, int count) { deflateStream.Write (src, src_offset, count); }
唯一的区别是,它总是创建一个deflateStream对象,并将gzip标志设置为true.这肯定不是你问题的答案,但也许它会有所帮助.