Boost Zlib在解压缩失败

时间:2015-11-24 18:50:41

标签: c++ boost zlib

我有一个个人项目,我必须使用zlib来解压缩一些数据。我将二进制数据存储到std :: vector中,其中byte_t不是unsigned char。

所以我将zlib解压缩功能从他们的网站修改为:http://pastebin.com/spXcRyxa

大约90%的测试一切正常,但随后它崩溃了应用程序(addToVector中的一些错误 - 无法找到它)。

然后我记得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 个答案:

答案 0 :(得分: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&获取压缩数据。您的函数会在解压缩之前复制输入...