2012-03-24 138 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