У меня есть несколько предварительно сжатых данных (сжатых с помощью zlib-flate в Linux) внутри моей оперативной памяти.Чтобы использовать эти сжатые данные, я хочу сжать их, используя zlib a inflate.
У меня нет динамического управления памятью в этой системе, но я предоставил достаточно большой буфер для несжатых данных.Проблема в том, что если я вызываю процедуру inflate после вызова процедуры inflateInit, я получаю необработанное исключение.
Но если я вызываю функцию inflateInit два раза, следующий inflate (= распаковка) работает нормально, и я получаю правильную распакованнуюданные в мой предоставленный буфер.Это странно, не правда ли?
Я также могу сделать сжатие в любое время, прежде чем вызывать инфляцию, и это также сработает ... какого черта?
Позвольте мне показать вам поведение:
- initInflate
- инфляция> ошибка
новый запуск ..
- initInflate
- initInflate
- inflate> success
новый запуск ..
- initDeflate
- deflate (успех, но я не использую результат)
- initInflate
- 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
.
И теперь я надеюсь, что вы можете мне помочь ..