2015-05-31 105 views
1

我想用zlib壓縮大小大於50mb的文件。 但我想要壓縮的文件是塊(例如,32Kb塊)。使用Zlib將數據壓縮爲塊

我不想讀取32Kb的未壓縮文件並對其進行壓縮。 壓縮文件應該包含32kb壓縮塊。 壓縮應在avail_out = 32kb後重置。

我只需要用zlib就可以做到這一點,這是隨機訪問。

這是我到目前爲止有:

do { 
    strm.avail_in = fread(in, 1, CHUNK, source); 

    flush = feof(source) ? Z_FINISH : Z_FULL_FLUSH; 
    strm.next_in = in; 
    strm.next_out = out; 

    strm.avail_out = CHUNK; 
    deflate(&strm, flush); 

    if (strm.avail_out == 0) 
     have = tmp; 
    else 
     have = CHUNK - strm.avail_out; 

    fwrite(out, 1, have, dest); 

    tmp = strm.avail_out; 

    if (tmp == 0) 
     deflateReset(&strm); 

} while (flush != Z_FINISH); 

但在這段代碼的幾個問題。

  1. 當我每次重置32Kb的壓縮,我輸了還沒有被寫入然而,由於avail_out盡是些壓縮字節;如果我嘗試寫它們,那麼壓縮的塊將不再是32Kb了。

  2. 如果我知道在填充avail_out時已經壓縮了多少數據,我可以重置文件位置並從那裏開始壓縮。

+1

你有什麼試過?你可以添加一些當前解決方案的代碼嗎?我問,因爲這看起來像一個單一的任務,你想讓別人爲你做這項工作。 – Augusto

+0

這不是一個uni任務。我編輯了這篇文章。感謝 – DeepSheet

回答

0

這是不可能的,以確保您可以確切地填寫所需的大小,但你可以非常接近。請參閱fitblk.c瞭解如何操作。

+0

感謝zlib的作者。雖然這不是答案,但我認爲這是儘可能接近的。所以我將其標記爲答案。 – DeepSheet