【问题标题】:How to decompress deflate stream (not gzip) using SharpZipLib?如何使用 SharpZipLib 解压缩 deflate 流(不是 gzip)?
【发布时间】:2023-06-29 19:22:02
【问题描述】:

我正在 Windows Phone 上开发一个应用程序并尝试通过 HTTP GET 方法从 Web 服务器获取数据,响应中的内容编码字段表明数据是通过 deflate 算法压缩的。

我找到了有用的库 SharpZipLib,它可以用 GZipInputStream 处理 gzip 流,但它不适用于 deflate 流。

如何使用 SharpZipLib 抑制流?或者有没有其他方法可以解决?

非常感谢!

【问题讨论】:

    标签: windows-phone-7 deflate sharpziplib compression


    【解决方案1】:

    不知道如何使用 SharpZipLib 实现这一点,但您确实有另一个选择,那就是 DotNetZip,它有一个 DeflateStream 全部打包并准备好在这里使用!

    此外,AFAIK,DotNetZip 已获得 Ms-Pl 许可,因此可用于商业应用,而 SharpZipLib (GPL) 则不能!

    【讨论】:

    • SharpZipLib for Windows Phone 允许在使用二进制形式的库的情况下与商业应用程序一起使用。
    • 非常感谢! DotNetZip 中的 DeflateStream 运行良好。
    【解决方案2】:

    小心。返回 deflate 方法的 http 服务器可能会提供两种不同的东西之一。 zlib-wrapped (RFC 1950) deflate (RFC 1951) 流(这是 http 标准指定的)或原始 deflate (RFC 1951) 流。后者是从没有仔细阅读标准的人编写的 Microsoft 服务器中看到的。

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

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

    【讨论】:

    • 感谢您的回答,但是远程服务器没有返回 gzip 流,我不知道它是哪个版本的 deflate。无论如何,我刚刚用上面提到的 DotNetZip 解决了我的问题。
    • 看起来 dotnetzip 有一个 DeflateStream 类和一个 ZlibStream 类。如果您使用 DeflateStream,则服务器(错误地)返回原始 deflate 数据。如果您使用的是 ZlibStream,则服务器(正确地)返回 zlib 包装的放气数据。我的观点是,为了使您的代码具有通用性,它应该尝试 zlib,如果这不起作用,请尝试 deflate。
    • @MarkAdler,从 .NET 4.5 开始,DeflateStream 内部使用 zlib。