Я успешно использую следующий код на 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.
My Boost версии 1.72.0
.
Я попытался вызвать простой пример сжатия / распаковки в вершина моей основной функции, и это сработало. Однако при использовании большего сжатого буфера все равно происходит сбой.
Этот ответ не относится ко мне, поскольку я пишу в std::stringstream
, а не в выходной файл.