Строка Gzip не может соединиться со строкой - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в C ++, и я пытаюсь найти ответ на этот вопрос, но вряд ли могу найти ответ. Я пытаюсь сжать тело строки html с помощью zlib в сжатии gzip, сжатие выполнено успешноно когда я пытаюсь объединить его с другой строкой, он не будет объединяться, при этом тело будет пустым, вот код сжатия:

void compress_message(){
            z_stream zs;
            char outbuffer[32768];
            long strlen = content.size();
            int ret;
            string outstring;

            memset(&zs, 0, sizeof(zs));

            if (deflateInit2(&zs, 
                     Z_BEST_COMPRESSION,
                     Z_DEFLATED,
                     MOD_GZIP_ZLIB_WINDOWSIZE + 16, 
                     MOD_GZIP_ZLIB_CFACTOR,
                     Z_DEFAULT_STRATEGY) != Z_OK
            ) {
                throw(std::runtime_error("deflateInit2 failed while compressing."));
            }

            content = "";

            zs.next_in = (Bytef*) content.data();
            zs.avail_in = strlen;

            do {
                //cout << "compressing..." << endl;
                zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
                zs.avail_out = sizeof(outbuffer);

                ret = deflate(&zs, Z_FINISH);

                if (content.size() < zs.total_out) {
                    // append the block to the output string
                    content.append(outbuffer,
                                     zs.total_out - content.size());
                }
            } while (ret == Z_OK);

            deflateEnd(&zs);
            //cout << "original: " << content << endl;
            if (ret != Z_STREAM_END) {          // an error occurred that was not EOF
                ostringstream oss;
                oss << "Exception during zlib compression: (" << ret << ") " << zs.msg;
                throw(std::runtime_error(oss.str()));
            }
        }

функция преобразования base64:

string tobase64(string data) {
    string code64,
        output = "";
    int i = 0,
        j = 0;
    unsigned int slen = data.size();
    const char* bytes_to_encode;
    code64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";
    unsigned char char_array_3[3],
        char_array_4[4];

    bytes_to_encode = data.c_str();

    while(slen--){
        char_array_3[i++] = bytes_to_encode[j++];

        if(3 == i){
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;

            for(i = 0; i < 4; i++){
                output += code64[char_array_4[i]];
            }

            i = 0;
        }
    }

    if (i)
    {
        for(j = i; j < 3; j++)
            char_array_3[j] = '\0';

        char_array_4[0] = ( char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

        for (j = 0; (j < i + 1); j++)
          output += code64[char_array_4[j]];

        while((i++ < 3))
          output += '=';
    }

    return output;
}

строка успешно сжимается, но когда я соединяю ее с ответом на строку, например:

string final_content = ("HTTP/1.1 200 OK\r\n"+headers+"\r\n\r\n");
content = tobase64(content);
final_content += content;

Я также пытался

final_content.append(content);

Они оба имеют одинаковый результат, тело никогда не объединяетсяfinal_content при выводе на печать показывает только:

HTTP/1.1 200 OK
...
Content-type: text/html

, и сжатая строка никогда не включается, пытается найти ответы в Интернете и не может понять, пожалуйста, помогите.Я работаю над этим на Ubuntu 18.04

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...