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

Pan*_*ant 6 c++ boost zlib

我需要在C++中对std :: string进行简单的压缩和解压缩.我查看了这个站点,代码是用于Character数组.我想要实现的是两个功能:

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;
Run Code Online (Sandbox Code Playgroud)

我曾尝试将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();
}
Run Code Online (Sandbox Code Playgroud)

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

Zan*_*tsu 6

你可以像@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;
Run Code Online (Sandbox Code Playgroud)

使用作为base64编码/解码库

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 为了完整性,您应该列出代码的include部分. (2认同)
  • 您的代码甚至无法编译,“std::stringstream”没有“c_str()”或“length()”方法,但它有一个“str()”方法来获取“std::string”。 (2认同)

Law*_*vil 2

压缩利用了每个字节的所有可用值,因此在尝试以 ascii 形式查看时,它将显示为“垃圾”或“怪异”字符。其预期。您需要对数据进行编码以进行传输/json 打包以避免空值。我建议使用 Base 64。可以在下面的链接中找到执行此操作的代码(该代码不是我创作的,因此我不会在此处复制)。

  1. http://www.adp-gmbh.ch/cpp/common/base64.html
  2. 二进制数据 JSONCPP