c++ - 简单的 Zlib C++ 字符串压缩和解压缩

标签 c++ boost zlib

我需要在 C++ 中对 std::string 进行简单的压缩和解压缩。我看了这个site代码用于字符数组。我要实现的是两个功能:

std::string original = "This is to be compressed!!!!";
std::string compressed = string_compress(original);
std::cout << compressed << std::endl;
std::string decompressed = string_decompress(compressed);
std::cout << decompressed << std::endl;

我试过 boost 压缩:

std::string CompressData(const std::string &data)
{
    std::stringstream compressed;
    std::stringstream decompressed;
    decompressed << data;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
    out.push(boost::iostreams::zlib_compressor());
    out.push(decompressed);
    boost::iostreams::copy(out, compressed);
    return compressed.str();
}

std::string DecompressData(const std::string &data)
{
    std::stringstream compressed;
    std::stringstream decompressed;
    compressed << data;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(compressed);
    boost::iostreams::copy(in, decompressed);
    return decompressed.str();
}

但代码有时会在字符串中给出 Null 字符,即 \u0000。如果压缩数据中包含这些空字符,我该如何处理。返回类型 string 是否正确?如何使用 zlib 实现函数 string_compressstring_decompress

最佳答案

您可以按照@LawfulEvil 的建议进行操作。这是有效的代码片段:)

std::string original = "This is to be compressed!!!!";
std::string compressed_encoded = string_compress_encode(original);
std::cout << compressed_encoded << std::endl;
std::string decompressed_decoded = string_decompress_decode(compressed_encoded);
std::cout << decompressed_decoded << std::endl;

使用 this作为 base64 编码/解码库。

#include <sstream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>
#include <cpp-base64/base64.h>

std::string string_compress_encode(const std::string &data)
{
    std::stringstream compressed;
    std::stringstream original;
    original << data;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
    out.push(boost::iostreams::zlib_compressor());
    out.push(original);
    boost::iostreams::copy(out, compressed);

    /**need to encode here **/
    std::string compressed_encoded = base64_encode(reinterpret_cast<const unsigned char*>(compressed.c_str()), compressed.length());

    return compressed_encoded;
}

std::string string_decompress_decode(const std::string &data)
{
    std::stringstream compressed_encoded;
    std::stringstream decompressed;
    compressed_encoded << data;

    /** first decode  then decompress **/
    std::string compressed = base64_decode(compressed_encoded);

    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(compressed);
    boost::iostreams::copy(in, decompressed);
    return decompressed.str();
}

关于c++ - 简单的 Zlib C++ 字符串压缩和解压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529570/

相关文章:

c++ - Clang 14 和 15 显然优化了在 Clang 13、ICC、GCC、MSVC 下按预期编译的代码

C++ 自动检测 shared_ptr 与 NULL 比较的位置

boost - 自引用 boost 变体

C++ 从类方法返回对象数组

C++:进入EOF后cin流的condition状态能否恢复

ruby - 仅在内存中创建 gzip

java - 用Java压缩,用Python解压?

python - 协议(protocol)中的 CRC 计算不正确。一种是使用zlib实现的,另一种是用函数计算的

c++ - 初始化具有动态长度的 vector

c++ - Boost::beast:多个 async_write 调用触发了断言错误