zlib - раздувать только работу после вызова inflateinit дважды - PullRequest
0 голосов
/ 07 июня 2018

У меня есть несколько предварительно сжатых данных (сжатых с помощью zlib-flate в Linux) внутри моей оперативной памяти.Чтобы использовать эти сжатые данные, я хочу сжать их, используя zlib a inflate.

У меня нет динамического управления памятью в этой системе, но я предоставил достаточно большой буфер для несжатых данных.Проблема в том, что если я вызываю процедуру inflate после вызова процедуры inflateInit, я получаю необработанное исключение.

Но если я вызываю функцию inflateInit два раза, следующий inflate (= распаковка) работает нормально, и я получаю правильную распакованнуюданные в мой предоставленный буфер.Это странно, не правда ли?

Я также могу сделать сжатие в любое время, прежде чем вызывать инфляцию, и это также сработает ... какого черта?

Позвольте мне показать вам поведение:

  1. initInflate
  2. инфляция> ошибка

новый запуск ..

  1. initInflate
  2. initInflate
  3. inflate> success

новый запуск ..

  1. initDeflate
  2. deflate (успех, но я не использую результат)
  3. initInflate
  4. inflate> success

Где-то есть массив, содержащийсжатые данные:

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 после первого init на 0x40195250 после второго init (возможно, это важная информация для вас).И оба блока являются ответом Z_OK.

И теперь я надеюсь, что вы можете мне помочь ..

1 Ответ

0 голосов
/ 08 июня 2018

Он выделяет память для потока дважды, используя только второе выделение.Я могу только догадываться, что вы перезаписываете только память, выделенную первым inflateInit(), из-за какой-то другой ошибки в вашей программе.Перезапись завершается сбоем inflate() при попытке использовать первое выделение, но происходит успешно при использовании второго выделения, который не перезаписывается другой ошибкой.

...