2012-09-23 150 views
0

我正在開發一個項目,其中如果我的磁盤出現問題,我會在使用ZLIB壓縮它之後將大塊內存發送到另一個磁盤。這個轉儲然後我打算下載並用於進一步的調試。這種壓縮和上傳是一次完成一塊 - 比如說1024K。ZLIB壓縮

這個問題是我需要輸出塊正好是1024K,然後才把它上傳到另一個磁盤上(除此之外,還會有標題和預告片以及這個塊大小是壓縮數據的大小),然後我可以輕鬆地解壓縮並使用它。我試着改變put_byte函數,一旦輸出緩衝區爲1024K,我可以將它發送到另一個磁盤,但這似乎不起作用。

我想過檢查Z_BUF_ERROR,然後發送它並重新啓動整個壓縮過程,但我不確定是否所有懸而未決的輸入/輸出都已刷新。

有一些其他的方式,我可以去這樣做 - 即確保當輸出緩衝器(壓縮數據大小)都只有1024K字節的數據包被髮送。

+0

O/P? OP? IP?請定義。 –

+0

O/P或OP =>存儲壓縮數據的輸出緩衝區IP或I/P =>存儲原始數據的輸入緩衝區。 – Zshn

+3

如果你只是想將'deflate()'的輸出分解爲1K塊,那麼只需要在輸出爲1K的地方提供'deflate()',即'strm.avail.out = 1024;'。提供輸入到'deflate()'直到'strm.avail.out == 0'或者用完輸入。然後寫出該塊。 –

回答

0

也許你會使用更高級別的門面庫像C++ http://github.com/rudi-cilibrasi/zlibcomplete ZLibComplete庫有更好的運氣。它使用std :: string並且不需要動態分配,所以你不需要自己管理任何緩衝區,只需簡單地放入std :: string並寫出返回的std :: string你也不需要檢查任何返回值,也不需要檢查你需要有條件地循環嗎?它只是在字符串方面起作用:放入一個字符串,只要你喜歡壓縮或解壓就可以得到一個字符串。有簡短的工作示例程序,您可以從兩種常見的壓縮格式GZip和ZLib開始。