2015-11-24 146 views
1

我有一個個人項目,我必須使用zlib來解壓縮一些數據。我將二進制數據存儲到std :: vector中,其中byte_t不是無符號的字符。Boost Zlib在解壓縮時失敗

所以,我從他們的網站修改zlib的解壓縮功能,看起來像:http://pastebin.com/spXcRyxa

一切正常測試的約90%,但隨後崩潰的應用程序(在addToVector一些bug - 找不到它)。

然後我記得boost有一個很好的zlib包裝。我使用zlib編譯boost,並搜索如何使用std :: vector(幾乎所有示例都是針對std :: string)。但我找到了bzip的例子(Uncompress data in memory using Boost gzip_decompressor),然後我改變了一些東西讓它運行;

std::vector<byte_t> unzip(const std::vector<byte_t> compressed) 
{ 
    std::vector<byte_t> decompressed = std::vector<byte_t>(); 

    boost::iostreams::filtering_ostream os; 

    os.push(boost::iostreams::zlib_decompressor()); 
    os.push(std::back_inserter(decompressed)); 

    boost::iostreams::write(os, reinterpret_cast<const char*>(&compressed[0]), compressed.size()); 

    return decompressed; 
} 

我的更改無法進行所有測試。來自boost zlib的解壓縮數據比正常的zlib庫短約10 000個字符。

我在這個boost zlib實現中做了什麼錯?謝謝 !

回答

1

真的,你的樣品應該是自包含和可重複的(容易,只包括一個微小的壓縮樣品基準)。

在這種情況下,這是我的兩分錢:確保它被刷新。最簡單的方法是使用沉沒數據之前關閉的ostream:

std::vector<byte_t> unzip(std::vector<byte_t> const& compressed) 
{ 
    std::vector<byte_t> decompressed = std::vector<byte_t>(); 

    { 
     boost::iostreams::filtering_ostream os; 

     os.push(boost::iostreams::zlib_decompressor()); 
     os.push(std::back_inserter(decompressed)); 

     boost::iostreams::write(os, reinterpret_cast<const char*>(&compressed[0]), compressed.size()); 
    } 

    return decompressed; 
} 

PS。請注意我如何通過const&獲取壓縮數據。您的功能將在解壓縮前複製輸入...

+0

它看起來工作。謝謝。我不需要複製數據,因爲我沒有使用解壓縮後的壓縮數據:D。 –

+0

您必須誤讀我關於複製輸入數據的評論 – sehe