Boost Zlib的解压缩在Windows上崩溃
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Boost Zlib的解压缩在Windows上崩溃相关的知识,希望对你有一定的参考价值。
我一直在Linux
上成功使用以下代码,但在boost::iostreams::copy()
的Windows
崩溃。可能是什么原因?
#include <sstream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>
// https://stackoverflow.com/a/17176881/3764804
bool is_compressed(const std::string &data) {
return data.at(0) == 0x78 && (unsigned char) data.at(1) == 0xDA;
}
std::string compress(const std::string &plain_text) {
boost::iostreams::filtering_streambuf<boost::iostreams::output> output_stream;
const auto compression_level = boost::iostreams::zlib::best_compression;
output_stream.push(boost::iostreams::zlib_compressor(compression_level));
std::stringstream string_stream;
output_stream.push(string_stream);
boost::iostreams::copy(boost::iostreams::basic_array_source<char>(plain_text.c_str(),
plain_text.size()), output_stream);
return string_stream.str();
}
std::string decompress(const std::string &cipher_text) {
std::stringstream string_stream;
string_stream << cipher_text;
boost::iostreams::filtering_streambuf<boost::iostreams::input> input_stream;
input_stream.push(boost::iostreams::zlib_decompressor());
input_stream.push(string_stream);
std::stringstream unpacked_text;
boost::iostreams::copy(input_stream, unpacked_text); // <-- Crashes here on Windows
return unpacked_text.str();
}
例外:
Exception thrown at 0x00007FFF08A8A859 in my_project.exe: Microsoft C++ exception: boost::wrapexcept<boost::iostreams::zlib_error> at memory location 0x00000015E14FD440.
Exception thrown at 0x00007FFF08A8A859 in my_project.exe: Microsoft C++ exception: [rethrow] at memory location 0x0000000000000000.
我的Boost是1.72.0
版。
我试图在我的主要功能的顶部调用一个简单的压缩/解压缩示例,并且它可以正常工作。但是,当使用更大的压缩缓冲区时,它仍然会以相同的方式崩溃。
[This answer不适用于我,因为我正在写std::stringstream
而不是输出文件。
答案
[几天后,我发现Windows
行分隔符0D 0A
被写入zlib
压缩文件中,而不仅仅是0A
上的Linux
。这出乎意料地导致减压崩溃。一个简单的解决方法是仅用0D 0A
替换所有0A
序列。参见this问题。不过,我不知道为什么需要这种“ hack”。也许还有一种更优雅的方式?也许我的解决方案甚至都不是傻瓜。随时发布另一个答案。
以上是关于Boost Zlib的解压缩在Windows上崩溃的主要内容,如果未能解决你的问题,请参考以下文章