将文件从 Boost filtering_streambuf 解压到 std::vector<unsigned char>?

Decompress file from Boost filtering_streambuf to std::vector<unsigned char>?

我正在编写一个执行ssl 3.1加密解密数据交换的程序。 我收到的数据也以 gzip 格式压缩。 我能够使用这段代码解密这些数据并将其打印到我的控制台:

void decompress(unsigned char * arr, int nCopySize, std::vector <unsigned char>& vecArg)
{
    using namespace boost::iostreams;
    using namespace boost::interprocess;
    std::string str1(reinterpret_cast<const char *>(arr), nCopySize);
    auto sizeT = str1.size();
    stringstream file2(str1, ios_base::in | ios_base::binary);
    filtering_streambuf<input> iin;
    iin.push(gzip_decompressor());
    iin.push(file2);
    boost::iostreams::copy(iin, cout);

//这里停止工作(解压后的代码在控制台打印成功)

    boost::interprocess::basic_vectorstream<std::vector<char>> vectorStream;
    boost::iostreams::copy(iin, vectorStream); // this produces compile time error
    std::vector<unsigned char> chars(
        vectorStream.vector().begin(),
        vectorStream.vector().end()
        );


}

我正在尝试将解压缩的代码存储到一个无符号字符向量中,但同时使用此处找到的最后一段代码:Decompress file from Boost filtering_streambuf to std::vector<char>? 我有这个编译时错误:

Error   5   error C2243: 'type cast' : conversion from 'boost::interprocess::basic_vectorstream<std::vector<char,std::allocator<char>>,std::char_traits<char>> *' to 'volatile const std::basic_streambuf<char,std::char_traits<char>> *' exists, but is inaccessible   c:\boost_1_59_0\boost\iostreams\traits.hpp  57  1   TeraLauncher

我做了其他尝试,使用 char 数组或字符串,设法编译但 运行 进入 运行 时间崩溃。 理想情况下,我希望它与我编写的代码 (std::vector) 一起工作。 谢谢

Live On Coliru

#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/device/array.hpp>
#include <iostream>
#include <vector>
#include <iterator>

namespace bio = boost::iostreams;

void decompress(unsigned char const* arr, std::size_t nCopySize, std::vector <unsigned char>& vecArg) {
    bio::array_source arrs{ reinterpret_cast<char const*>(arr), nCopySize };

    bio::filtering_istreambuf iin;
    iin.push(bio::gzip_decompressor{});
    iin.push(arrs);

    vecArg.assign(std::istreambuf_iterator<char>{&iin}, {});
}

int main() {
    /*
     * If you really want to hear about it, the first thing you'll probably want to know is
     * where I was born, an what my lousy childhood was like, and how my parents were
     * occupied and all before they had me, and all that David Copperfield kind of crap, but I
     * don't feel like going into it, if you want to know the truth. In the first place, that stuff
     * bores me, and in the second place, my parents would have about two hemorrhages apiece
     * if I told anything pretty personal about them. They're quite touchy about anything like
     * that, especially my father.
     */
    unsigned char sample[] = {
        0x1f, 0x8b, 0x08, 0x00, 0x8a, 0x47, 0xd7, 0x56, 0x00, 0x03, 0x55, 0x52, 0x4b, 0x76, 0xc3, 0x20, 0x10, 0xdb, 0xfb, 0x14, 0xda, 0x65, 0xe3, 0x97,
        0x4b, 0xb4, 0x1b, 0xef, 0x7b, 0x81, 0x31, 0x0c, 0x81, 0x17, 0xc2, 0x50, 0x3e, 0xf5, 0xf3, 0xed, 0x3b, 0xd8, 0x69, 0x5e, 0xba, 0x84, 0x91, 0x34,
        0x92, 0x60, 0x71, 0xd8, 0xa5, 0xa3, 0x30, 0xc5, 0xb8, 0x63, 0xa3, 0xd4, 0xd0, 0x04, 0x9e, 0xa9, 0x80, 0x56, 0xe9, 0x0d, 0xa1, 0xcd, 0x68, 0x9e,
        0xe1, 0x42, 0xa9, 0x3a, 0xf3, 0x21, 0xdd, 0x06, 0xe3, 0x12, 0x23, 0x72, 0x91, 0x95, 0xd6, 0x37, 0xda, 0x3d, 0xc9, 0x86, 0x50, 0xa7, 0xcd, 0x73,
        0x61, 0x2c, 0x7a, 0x5f, 0xb1, 0x4a, 0x49, 0x33, 0x28, 0x61, 0xf3, 0xd4, 0xf0, 0xd8, 0x11, 0xa5, 0xd7, 0x1d, 0xc6, 0x87, 0x68, 0xbd, 0x88, 0x3d,
        0x40, 0x31, 0xdc, 0x79, 0x80, 0x2c, 0xbc, 0x2a, 0x28, 0x28, 0x53, 0xe1, 0xd4, 0x2a, 0x36, 0x15, 0x9a, 0xc4, 0x98, 0x9e, 0x03, 0xdb, 0x03, 0xa0,
        0x3e, 0xb1, 0xb2, 0x13, 0x5d, 0xa0, 0xb6, 0x76, 0x78, 0xb2, 0x78, 0x3c, 0xc9, 0x63, 0xd6, 0xc6, 0x9a, 0x4f, 0xfa, 0x09, 0x16, 0x1f, 0x92, 0x33,
        0x17, 0x17, 0x38, 0x5a, 0xdc, 0x83, 0xce, 0xc5, 0xc1, 0x14, 0xca, 0x33, 0x56, 0x0d, 0xb6, 0x4c, 0x56, 0xd2, 0xa5, 0xc1, 0x31, 0xc7, 0xc3, 0x00,
        0x6e, 0x32, 0xc2, 0x85, 0xa4, 0x49, 0x46, 0xea, 0x70, 0x56, 0xf3, 0x2f, 0xdc, 0x68, 0xa2, 0x95, 0xde, 0xfc, 0x15, 0x4b, 0x7a, 0xeb, 0x25, 0x47,
        0x32, 0x3c, 0x9f, 0xcb, 0x6b, 0xeb, 0xce, 0x4d, 0x9a, 0x9b, 0xeb, 0xcb, 0x59, 0x38, 0xc1, 0x95, 0x8d, 0xe8, 0xe9, 0x89, 0x7e, 0xcf, 0x29, 0x5d,
        0x4d, 0x7a, 0xfa, 0xe1, 0x67, 0xed, 0x6d, 0x1b, 0xaf, 0xf0, 0x90, 0x52, 0x3c, 0xdd, 0x54, 0x88, 0xb4, 0x00, 0xc3, 0x93, 0x7a, 0x5a, 0xd4, 0x4c,
        0x1c, 0x5d, 0xec, 0xe7, 0x63, 0xe4, 0xc2, 0xad, 0xa9, 0x12, 0x97, 0x2a, 0x89, 0xe2, 0x1f, 0x5f, 0xc9, 0x57, 0x7c, 0x69, 0x43, 0x17, 0x6d, 0xea,
        0xbb, 0x87, 0xa6, 0xc6, 0xa5, 0x1b, 0xbf, 0x3f, 0x01, 0x2f, 0xfe, 0x88, 0x3e, 0x0d, 0xe3, 0x33, 0xb8, 0x66, 0x36, 0xe1, 0xf8, 0x09, 0xea, 0xcd,
        0x91, 0x8a, 0x94, 0xeb, 0xf4, 0x0b, 0xb2, 0xb3, 0x9b, 0x5a, 0x23, 0x02, 0x00, 0x00 };

    std::vector<unsigned char> d;
    decompress(sample, sizeof(sample), d);

    std::cout.write(reinterpret_cast<char const*>(&*d.begin()), d.size());
}

版画

If you really want to hear about it, the first thing you'll probably want to know is
where I was born, an what my lousy childhood was like, and how my parents were
occupied and all before they had me, and all that David Copperfield kind of crap, but I
don't feel like going into it, if you want to know the truth. In the first place, that stuff
bores me, and in the second place, my parents would have about two hemorrhages apiece
if I told anything pretty personal about them. They're quite touchy about anything like
that, especially my father.