Boost Zlib 解压失败
Boost Zlib fails at decompression
我有一个个人项目,我必须使用 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 实现中做错了什么?谢谢!
实际上,您的样本应该是独立的且可重现的(简单,只需包含一个微小的压缩样本数据)。
如果没有,这是我的两分钱:确保它已冲洗干净。最简单的方法是在使用沉没数据之前关闭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&
获取压缩数据。您的函数将在解压缩之前复制输入...
我有一个个人项目,我必须使用 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 实现中做错了什么?谢谢!
实际上,您的样本应该是独立的且可重现的(简单,只需包含一个微小的压缩样本数据)。
如果没有,这是我的两分钱:确保它已冲洗干净。最简单的方法是在使用沉没数据之前关闭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&
获取压缩数据。您的函数将在解压缩之前复制输入...