2011-02-04 87 views
4

我是否可以在內存中讀取zlib壓縮文件而不實際將其提取到磁盤?如果你能提供一個片段,這將是很好的。使用zlib進行內存解壓縮

+10

你有沒有嘗試過你自己呢?只是提示:「請提供代碼」是尋求幫助的不好方法。沒有人願意免費爲你做你的工作,但人們確實希望幫助你解決一個你無法弄清楚的問題。用這種方式來說出你的問題以獲得更好的結果 – 2011-02-04 19:00:05

+5

如果你嘗試了一下,你會得到更多的幫助,然後告訴我們你卡在哪裏。如果你堅持從哪裏開始,你可以在你的問題中指出你正在考慮的一些想法。 – 2011-02-04 19:00:58

+7

這將是很好的工作,而不是你付出代價;) – 2011-02-04 19:03:45

回答

0

是的,你可以; zlib通常用於嵌入式系統中,將應用程序映像從ROM解壓縮到RAM中 - 完全是從內存到內存的操作。

zlib文檔描述了必要的調用。

15

這裏是一個zLib充氣例程,它將內存中的緩衝區解壓縮到提供的輸出緩衝區中。這是一個「一次性」功能,因爲它試圖一次膨脹整個輸入緩衝區,並假定你已經給了它足夠的空間來適應所有。也可以根據需要編寫一個動態增長目標緩衝區的多鏡頭功能。

int inflate(const void *src, int srcLen, void *dst, int dstLen) { 
    z_stream strm = {0}; 
    strm.total_in = strm.avail_in = srcLen; 
    strm.total_out = strm.avail_out = dstLen; 
    strm.next_in = (Bytef *) src; 
    strm.next_out = (Bytef *) dst; 

    strm.zalloc = Z_NULL; 
    strm.zfree = Z_NULL; 
    strm.opaque = Z_NULL; 

    int err = -1; 
    int ret = -1; 

    err = inflateInit2(&strm, (15 + 32)); //15 window bits, and the +32 tells zlib to to detect if using gzip or zlib 
    if (err == Z_OK) { 
     err = inflate(&strm, Z_FINISH); 
     if (err == Z_STREAM_END) { 
      ret = strm.total_out; 
     } 
     else { 
      inflateEnd(&strm); 
      return err; 
     } 
    } 
    else { 
     inflateEnd(&strm); 
     return err; 
    } 

    inflateEnd(&strm); 
    return ret; 
} 

說明:

SRC:包含壓縮(gzip的或zlib的)數據
srcLen源緩衝區:源緩衝區的長度
DST:目標緩衝區,將輸出寫入其中
dstLen:目標緩衝區的長度

返回值:

Z_BUF_ERROR:如果dstLen不夠大,以適應膨脹數據
Z_MEM_ERROR:如果有足夠的內存來執行解壓縮
Z_DATA_ERROR:如果輸入數據被損壞

否則,返回值是寫入dst的字節數。