zlib сжатие потока

188
26 ноября 2016, 19:06
#include "include\\zlib.h"
#pragma comment(lib, "lib\\zdll")
#include <vector>
#include <iostream>
using namespace std;
class CompressStream
{
public:
    CompressStream(int compressLevel = Z_DEFAULT_COMPRESSION)
    {
        _strm.zalloc = 0;
        _strm.zfree = 0;
        _strm.next_in = NULL;
        _strm.avail_in = 0;
        _strm.next_out = _temp_buffer;
        _strm.avail_out = _BUFSIZE;
        deflateInit(&_strm, compressLevel);
    }
    ~CompressStream()
    {
        deflateEnd(&_strm);
    }
    int write(uint8_t* data, size_t len)
    {
        _in.insert(_in.end(), data, data + len);
        return _compress();
    }
    void read(uint8_t* data, size_t* readLen, size_t maxLen)
    {
        if (_out.size() < maxLen) { maxLen = _out.size(); }
        memcpy(data, _out.data(), maxLen);
        _out.erase(_out.begin(), _out.begin() + maxLen);
        *readLen = maxLen;
    }
private:
    int _compress()
    {
        _strm.next_in = _in.data();
        _strm.avail_in = _in.size();
        int res = Z_OK;
        while (res == Z_OK)
        {
            //cout << _strm.avail_in << ' ' << _strm.avail_out << endl;
            if (_strm.avail_out == 0)
            {
                _out.insert(_out.end(), _temp_buffer, _temp_buffer + _BUFSIZE);
                _strm.next_out = _temp_buffer;
                _strm.avail_out = _BUFSIZE;
            }
            res = deflate(&_strm, Z_FINISH);
        }
        _out.insert(_out.end(), _temp_buffer, _temp_buffer + _BUFSIZE - _strm.avail_out);
        _in.clear();
        if (res != Z_STREAM_END) { return res; }
        else { return Z_OK; }
    }

    std::vector<uint8_t> _in;
    std::vector<uint8_t> _out;
    static const size_t _BUFSIZE = 128 * 1024;
    uint8_t _temp_buffer[_BUFSIZE];
    z_stream _strm;
};

void main()
{
    CompressStream cs;
    for (int i = 0; i < 10; ++i)
    {
        cout << cs.write((unsigned char*)"My BUFF", 7) << endl;
    }
    system("pause");
}

На первый write все хорошо, 2 и следующие возвращают Z_BUF_ERROR

READ ALSO
Сборка Boost - не может найти файл corecrt.h

Сборка Boost - не может найти файл corecrt.h

Нужно срочно собрать Boost 1_62_0 на Windows 7 x64 SP1Нет файла corecrt

278
Регулярные выражения в qt

Регулярные выражения в qt

Суть проблемы: Написал я регулярное выражение, которое ищет '{' и оглядывается назад, чтобы посмотреть, нет ли там признака коментариев, и когда...

208
Segmentation fault при разборе аргументов main() c++ [закрыто]

Segmentation fault при разборе аргументов main() c++ [закрыто]

ЗдравствуйтеМне нужно определить аргументы командной строки и исходя из полученых команд проделать некие действия

164
Не могу разобраться с vector &lt; unque_ptr &lt;T&gt;&gt;

Не могу разобраться с vector < unque_ptr <T>>

Есть класс, в котором есть поле вектора из unique_ptr (Animals - тоже класс), а так же методы чтения и записи в файл этого вектора классаВот фрагмент...

180