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

Simple Zlib C++ String Compression and Decompression

本文关键字:压缩 解压缩 字符串 C++ zlib 简单      更新时间:2023-10-16

我需要对 std::string 进行简单的压缩和解压缩C++。我看了这个网站,代码是字符数组的。我要实现的是两个函数:

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;

我尝试过提升压缩,因为:

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。如果压缩数据包含这些空字符,如何处理。返回类型字符串是否正确?如何使用 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;

将其用作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();
}

压缩利用每个字节的所有可用值,因此在尝试查看为 ascii 时,它将显示为"垃圾"或"奇怪"字符。 这是意料之中的。 您需要对传输/json打包的数据进行编码,以避免空值。 我建议以64为基地。 执行此操作的代码可在下面的链接中找到(我没有编写,所以我不会在这里复制)。

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