2012-03-24 82 views
1

我正在使用Windows Phone上的应用程序,并尝试通过HTTP GET方法从Web服务器获取数据,并且响应中的内容编码字段指示数据是通过缩放算法压缩的。如何使用SharpZipLib解压缩放气流(不是gzip)?

我发现有用的库SharpZipLib,它可以处理与GZipInputStream gzip流,但它不适用于deflate流。

如何使用SharpZipLib压缩流?或者还有其他方法可以解决这个问题吗?

非常感谢!

回答

1

不知道如何用SharpZipLib实现这个目标,但是你有另外的选择,那就是DotNetZip,它有一个DeflateStream所有包装好了并且可以在这里使用!此外,AFAIK,DotNetZip是Ms-Pl许可证,所以它可以用于商业应用,SharpZipLib(GPL)不能!

+1

如果使用库的二进制格式,Windows Phone的SharpZipLib允许与商业应用程序一起使用。 – 2012-03-25 17:24:47

+0

不错,谢谢你清理那部分,@RichardSzalay! – 2012-03-25 18:59:54

+0

非常感谢! DotNetZip中的DeflateStream功能完美。 – cotaku39 2012-03-26 03:45:21

1

请注意。一个返回deflate方法的http服务器可以提供两种不同的东西中的一种。无论是zlib-wrapped(RFC 1950)deflate(RFC 1951)流(这是http标准指定的内容)还是原始deflate(RFC 1951)流。后者从微软服务器上看过,这些服务器是由没有仔细阅读标准的人编写的。

您可以通过两种方式尝试解决此问题(以正确的方式开始),也可以不提供deflate作为客户端接受的方法,只允许gzip。 gzip没有歧义。

可能有一个zlib的接口允许您尝试这两种方式,或者如果没有,您可能需要编写自己的接口或直接使用zlib。在zlib中,您可以通过从inflateInit(strm)开始解码zlib-wrapped流,或者您可以解码以inflateInit2(strm,-15)开始的原始deflate流。

+0

感谢您的回答,但远程服务器不返回gzip流,我不知道它是哪个版本的deflate。无论如何,我只是用上面提到的DotNetZip解决了我的问题。 – cotaku39 2012-03-26 03:48:58

+0

它看起来像dotnetzip有一个DeflateStream类和一个ZlibStream类。如果你使用的是DeflateStream,那么服务器(不正确)返回原始deflate数据。如果您使用的是ZlibStream,则服务器(正确)返回zlib包裹的deflate数据。我的观点是,为了你的代码是一般的,它应该尝试zlib,如果这不起作用,然后尝试放气。 – 2012-03-26 04:30:29

+0

@MarkAdler,自.NET 4.5起,DeflateStream内部使用zlib。 – Annie 2012-11-27 05:36:53