2009-02-04 62 views
7

我正在構建一個網絡應用程序,需要能夠從正常網絡流量切換到zlib壓縮流,中間流。我對此事的看法涉及到布爾開關,當開啓時會導致網絡代碼將所有數據通過一個可將IEnumerable<byte>饋入的類傳遞,然後取出解壓縮的流,並將其傳遞給已存在的協議分析代碼。.NET中很好的zlib實現?

事情我已經看了看:

  • ZLib.NET - 這似乎有點... Ecclectic,而不是我想要什麼相當。儘管如此,仍然會有一個體面的開始。 (Jon Skeet's comments here幾乎不能激發我)
  • SharpZipLib - 這似乎並不支持zlib?任何人都可以確認或否認這一點?

我非常喜歡和所有的託管解決方案,但讓我們來看看...在.NET中有沒有這種庫的其他實現,這可能更適合我想要做的,或者我應該採用ZLib.NET並將其作爲開始?

PS:

喬恩的要求更多的細節,所以在這兒呢。我想實現MCCP 2。這涉及在網絡流中發送的信號,並且該信號之後的所有信息都是zlib壓縮數據流。在上面的鏈接中有鏈接到它們的意思。無論如何,要清楚的是,我在接收端(客戶端,而不是服務器),並且我已經從網絡流中讀出了一堆數據,並且切換將在這中間(全部可能性至少),所以任何解決方案都需要能夠在接管NetworkStream(或我手動輸入其餘數據)之前將一些額外的數據輸入到它中。

+0

當您獲得特定數據包時,壓縮包的標頭是否會開始? – 2009-02-04 21:35:12

+0

我不知道這件事。就我個人而言,我不會太在意這個細節。我懷疑這是服務器實現特定的,在任何描述文檔中都沒有提及它。 – 2009-02-04 21:53:37

+0

您是否曾經爲MCCP 2獲得過良好的圖書館? – m4tt1mus 2011-07-28 22:00:31

回答

3

SharpZipLib不支持的ZLib。看看this FAQ entry

此外,你有檢查是否System.IO.Compression命名空間支持你所需要的?

我不會使用IEnumerable<byte>雖然 - 流設計是鏈接在一起。

編輯:好吧......聽起來像你需要一個支持緩衝的流,但比BufferedStream提供更多的控制。如果看到解壓縮切換,則需要「回放」流,然後在其上創建GZipStream。您的緩衝區至少需要與對Read()的最大調用一樣大,以便您始終可以有足夠的緩衝區來倒帶。

0

據我所知ZLib(gzip)庫不支持在頭文件中列出文件。假設對你很重要,但它似乎是一個很大的缺點。這是我剛剛使用銳利的zip庫時,所以我願意刪除這:) :)

3

包含在DotNetZip中有一個ZlibStream,用於壓縮或解壓zlib數據流。你沒有問,但也有一個GZipStream和一個DeflateStream。以及ZlibCodec類,如果這是你的事情。 (只是膨脹或收縮緩衝區,而不是流)。

DotNetZip是一個擁有自由許可證的完全託管的圖書館。你不需要使用任何.zip功能來獲得Zlib的東西。而zlib的東西被打包成一個單獨的(更小的)DLL就是爲了這個目的。