Simple Zlib C++ String Compression and Decompression

前端 未结 2 560
耶瑟儿~
耶瑟儿~ 2020-12-31 20:48

I need a simple compression and decompression of a std::string in C++. I looked at this site and the code is for Character array. What I want to implement are the two functi

相关标签:
2条回答
  • 2020-12-31 21:26

    You can do as @LawfulEvil suggested. Here is the code snippet that works :)

    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;
    

    Using this as the base64 encode/decode library.

    #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();
    }
    
    0 讨论(0)
  • 2020-12-31 21:30

    Compression makes use of all the values available for each byte, so it will appear as 'garbage' or 'weird' characters when attempting to view as ascii. Its expected. You'll need to encode the data for transmission / json packing to avoid nulls. I suggest base 64. Code to do that is available at the link below(which I didn't author so I won't copy here).

    1. http://www.adp-gmbh.ch/cpp/common/base64.html
    2. Binary data JSONCPP
    0 讨论(0)
提交回复
热议问题