簡體   English   中英

在C ++中使用Miniz將向量解壓縮為另一個向量

[英]Decompressing a vector into another vector using miniz in c++

我正在嘗試在這里做最簡單的事情。 我想創建一個將接收字節(char)數組的方法,使用miniz tinfl_decompress方法對其進行充氣,然后返回包含膨脹數據的字節數組。

首先是第一件事。 給定的陣列永遠不會大於100kB,絕大多數將小於50k。 因此,我認為我不需要使用任何類型的緩沖區。 無論如何,這就是我所擁有的:

std::vector<unsigned char> unzip(std::vector<unsigned char> data)
{
    unsigned char *outBuffer = new unsigned char[1024 * 1024];

    tinfl_decompressor inflator;
    tinfl_status status;
    tinfl_init(&inflator);

    size_t inBytes = data.size() - 9;
    size_t outBytes = 1024 * 1024;

    status = tinfl_decompress(&inflator, (const mz_uint8 *)&data[9], &inBytes, outBuffer, (mz_uint8 *)outBuffer, &outBytes, 0);

    return ???
}

我知道我想要的輸出從內存位置&outBuffer開始,但是我不知道它有多長(我碰巧知道它會小於1MB),所以我無法將其打包到向量中並以這種方式發送。 我曾希望outBytes可以保存輸出的大小,但是在解壓縮后將它們設置為1。 我知道解壓縮沒有失敗,因為返回的statusTINFL_STATUS_DONE (0)

這是正確的方法嗎? 這是在我的程序中經常調用的一種方法,因此我需要盡可能快的方法。

如何從中獲取向量? 我應該使用其他數據類型嗎? 數組([]類型)? 解壓縮后的數據在丟棄之后將僅被順序讀取一次。

編輯:

我試圖解壓縮的文件似乎格式不正確; 它是zip,需要zlib。

警告:完全未經測試的代碼。

它應該像交換一樣

unsigned char *outBuffer = new unsigned char[1024 * 1024];

對於

std::vector<unsigned char> outBuffer(1024 * 1024);

得到一個向量。 然后使用data方法調用tinfl_decompress以獲取向量的基礎緩沖區。 它看起來應該像

status = tinfl_decompress(&inflator, 
                          (const mz_uint8 *)&data[9], 
                          &inBytes, 
                          (mz_uint8 *)outBuffer.data(), 
                          (mz_uint8 *)outBuffer.data(), 
                          &outBytes, 
                          0);

然后將向量的resize為向量中存儲的字節數,以方便以后使用。

outBuffer.resize(outBytes);

請注意,矢量將不會縮小。 它將仍然具有1 MiB的容量。 如果這是一個問題,則需要另外調用std::vector::shrink_to_fit

最后

return outBuffer;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM