У меня есть некоторые предварительно сжатые данные (сжатые с помощью zlib-flate в Linux) внутри моей оперативной памяти. Чтобы использовать эти сжатые данные, я хочу сжать их с помощью zlib и надуть.
У меня нет динамического управления памятью в этой системе, но я предоставил достаточно большой буфер для несжатых данных. Проблема в том, что если я вызываю подпрограмму inflate после вызова подпрограммы inflateInit, я получаю необработанное исключение.
Но если я вызову функцию inflateInit два раза, следующая инфляция (= распаковка) работает нормально, и я получаю правильные распакованные данные в предоставленный буфер. Это странно не так ли?
Я также могу сделать сжатие в любое время перед вызовом надувания, и это тоже сработает.. какого черта?
Позвольте мне показать вам поведение:
- initInflate
- раздувать > неудачно
новый пробег..
- initInflate
- initInflate
- раздувать > успех
новый пробег..
- initDeflate
- deflate (успех, но я не использую результат)
- initInflate
- раздувать > успех
Где-то есть массив, содержащий сжатые данные:
uint8_t src [] = {.....};
Это мой буфер, который определенно достаточно велик, чтобы содержать полные распакованные данные.
#define BUF_SIZE 1000
uint8_t buf[BUF_SIZE];
А это код моей распаковки:
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = srcLen;
strm.next_in = src;
strm.avail_out = BUF_SIZE;
strm.next_out = buf;
strm.data_type = Z_BINARY;
inflateInit(&strm);
inflateInit(&strm); // the follwing inflate only works with this second init
inflate(&strm, Z_NO_FLUSH);
Я вижу, что член потока state
меняется с 0x40193678
после первой инициализации на 0x40195250
после второй инициализации (возможно, это важная информация для вас). И обе инициализации являются ответом с Z_OK
.
И теперь я надеюсь, что вы можете мне помочь ..
inflate()
? - person Mark Adler   schedule 08.06.2018Z_STREAM_END
. Если инфляция не удалась (например, потому что я вызвалinflateInit()
только один раз), кажется, что я сталкиваюсь с необработанным исключением, потому что мой программный счетчик скачет в никуда (вектор загрузки или что-то подобное - программа аварийно завершает работу). - person PIC-Nico   schedule 08.06.2018malloc
. Поэтому я предоставил достаточно большой буфер (я знаю размер несжатых данных), чтобы zlib мог обрабатывать полные данные за один проход. - person PIC-Nico   schedule 08.06.2018