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上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 Boost 中编译 iostreams 库时更改 boost_zlib DLL 名称?

C/C++ 自制一个基于zlib的文件的(解)压缩系统

C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序

Objective-C 奇怪的解压缩行为导致文件损坏

Ubuntu中一些常用的解压缩操作

库中静态分配的 zlib 字节数组上的 memset 使 Objective-C++ 程序崩溃