2010-11-28 27 views
3

我需要一個zlib deflate壓縮流。在我的實現中,我必須在整個會話中使用單個流。在此會話期間,小數據塊將通過壓縮流傳遞。每次傳入一個塊時,都必須立即以壓縮格式發送。「同步刷新」Zlib Deflate

我的第一次嘗試是使用DeflateStream,但是當我發送第一個塊時,它的壓縮數據將不會出現,直到我關閉流。

閱讀約zlib flush modes它看起來好像有一個特定的模式,我需要什麼。

  1. 我使用正確的類(DeflateStream)zlib放氣壓縮?
  2. 如何啓用「同步刷新」行爲?

回答

2

DotNetZip項目有一個子模塊Zlib,它包含一個自己的DeflateStream實現。

這實現了一個名爲FlushMode另一個屬性:

DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress); 
deflate.FlushMode = FlushType.Sync; 
deflate.Write (data, 0, data.Length); 
//No call to deflate.Flush() needed, automatically flushed on every write. 
+0

不幸的是,這個庫不能正確地支持異步方法。儘管壓縮本身並不能從異步操作中受益(它受CPU限制),但是如果您通過網絡發送/接收,底層流通常會受益。 – 2017-10-28 08:58:24

0

它確實只在關閉時沖洗。您需要每次都使用不同的DeflateStream實例,並在關閉DeflateStream時將true改爲overloaded constructor告訴它而不是以關閉底層流。

+0

恐怕這不是一個選項,因爲流開始於一個預定義的900字節的啓動塊,因此我需要一個運行流。 – hultqvist 2010-11-28 16:13:25

0

要回答你關於你如何可以使「同步沖洗」行爲的問題,您應該看到在zlib的源代碼zpipe.c例子。
替換下面

Deflate()所示的第二行中的第一行會在每次輸出緩衝區滿返回 或當輸入緩衝器是空的同時附加到 壓縮流的空字面塊也被稱爲 「同步刷新「,除了在末尾是Z_FINISH標誌。

flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; 
    flush = feof(source) ? Z_FINISH : Z_SYNC_FLUSH; 
    ret = deflate(&strm, flush); 
相關問題