我试过了:
> System.IO.Compression.GZipStream
> System.IO.Compression.DeflateStream
> ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream
> zlib.ZOutputStream
这些似乎都没有使ByteArray.uncompress高兴,即我得到
Error #2058: There was an error decompressing the data.
整个Deflate vs zlib让我绕圈子走了.
看来根据wikipedia的文章,zlib是DEFLATE的一个实现.但根据Actionscript他们是两个不同的东西?
微软似乎也表示Gzip至少使用Deflate算法,因为在他们的文档中他们提到GZipOutputStream使用与DeflateStream相同的压缩算法.所以我假设它只是一个标题差异,这表明“不好”至于’ByteArray.uncompress’,因为“DEFLATE”算法仅在AIR应用程序中受支持.
示例“服务器”代码,在这种情况下使用SharpZipLib(不工作):
public virtual bool ProcessRequest(string path,HttpListenerContext context) { var buffer = File.ReadAllBytes(path); // Specifying to strip header/footer from data as that seems to be what the // docs for ByteArray.uncompress indicate is necessary var deflater = new Deflater(Deflater.DEFAULT_COMPRESSION,true); using (var zipStream = new DeflaterOutputStream(context.Response.OutputStream,deflater)) { zipStream.Write(buffer,buffer.Length); } }
解决方法
> RFC 1950,ZLIB
> RFC 1951,DEFLATE
> RFC 1952,GZIP
它们都(主要)使用特定的压缩算法,即DEFLATE.
ZLIB如何与DEFLATE相关联
第一个是ZLIB,包括开头的帧字节.根据RFC 1950 ……
A zlib stream has the following structure: 0 1 +---+---+ |CMF|FLG| (more-->) +---+---+ (if FLG.FDICT set) 0 1 2 3 +---+---+---+---+ | DICTID | (more-->) +---+---+---+---+ +=====================+---+---+---+---+ |...compressed data...| ADLER32 | +=====================+---+---+---+---+
CMF和FLG是字节.正如规范所说,ZLIB中使用的主要压缩方法是DEFLATE,尽管规范可以与其他方法一起使用.一般情况下不是.此外,通常不使用DICTID.因此,每个ZLIB字节流都有2个字节,后跟压缩数据流,然后是Adler32校验和.压缩数据是来自DEFLATE的裸字节流.
GZIP如何与DEFLATE相关
这样可以解决ZLIB与DEFLATE的不同之处. GZIP是第三种格式.如果您需要详细信息,请查看RFC.关键是像ZLIB一样,GZIP主要使用DEFLATE,它在压缩数据流之前放置一个标头,然后是校验和.但是GZIP头与ZLIB头不同,因此任何GZipStream类都不能编写可以作为ZLIB读取的字节流.反之亦然.
解决问题
在通过前两个ZLIB成帧字节推进流之后,在数据流上使用.NET的内置DeflateStream读取ZLIB Stream,some people address the problem you experienced时.这是有效的,只要您想要READ,ZLIB流使用DEFLATE(安全假设)并且它不定义固定字典(也非常安全),如果您不关心Adler32提供的完整性检查(也许).
如果您不喜欢做出这些假设或放弃检查,或者您必须生成一个ZLIB数据流,那么DotNetZip中的ZlibStream将为您读取和写入ZLIB数据流,并根据需要验证或生成校验和.
DotNetZip可以免费使用,适用于任何.NET语言.您不需要完整的DotNetZip库,而只需要Ionic.Zlib.dll.