почему zlib вызов deflateInit однажды не работает? - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время я пишу функцию, которая сжимает массив символов с помощью zlib. Поскольку я хочу оптимизировать производительность и скорость, я хочу вызывать deflateInit () только один раз и повторно использовать объект zstream, так как я хочу избежать повторного выделения и повторного выделения. Я попробовал ниже метод, который просто обновляет входной и выходной буфер в объекте zstream, но он не дает правильного вывода из второй итерации, пока l oop. Ниже приведен код:

ВЫХОД:

----------

ret1
avail_out35
Compressed size is: 9
Compressed string is: x�KL#
                           0
Compressed return value is: 1
Avail out is: 35
Compressed length is: 15

----------

Timestamp: Total compression took: 103 microseconds
ret-5
avail_out50
Compressed size is: 0
Compressed string is: 
Compressed return value is: -5
Avail out is: 50
Compressed length is: 15

----------

Timestamp: Total compression took: 42 microseconds
ret-5
avail_out50
Compressed size is: 0
Compressed string is: 
Compressed return value is: -5
Avail out is: 50
Compressed length is: 15

----------

Timestamp: Total compression took: 41 microseconds
ret-5
avail_out50
Compressed size is: 0
Compressed string is: 
Compressed return value is: -5
Avail out is: 50
Compressed length is: 15

----------

Timestamp: Total compression took: 41 microseconds
ret-5
avail_out50
Compressed size is: 0
Compressed string is: 
Compressed return value is: -5
Avail out is: 50
Compressed length is: 15

----------

Timestamp: Total compression took: 42 microseconds

Здесь вы можете видеть, что я получаю код ошибки -5 (Z_BUF_ERROR) и пустой b массив из второй итерации while l oop. Но если я переместу объявление объекта zlib и deflateInit () внутрь, пока l oop, все работает нормально. Любое объяснение?

1 Ответ

0 голосов
/ 14 февраля 2020

В do c из zlib они пишут:

Если для параметра flu sh установлено значение Z_FINI SH, ожидающий ввод обрабатывается в ожидании вывод сбрасывается, и deflate возвращается с Z_STREAM_END, если было достаточно выходного пространства. Если deflate возвращает с Z_OK или Z_BUF_ERROR, эта функция должна быть вызвана снова с Z_FINI SH и большим выходным пространством (обновлн.в_доступе), но без дополнительных входных данных, пока не вернется с Z_STREAM_END или ошибкой. После того, как deflate вернул Z_STREAM_END, единственными возможными операциями в потоке являются deflateReset или deflateEnd.

Таким образом, ему нужно больше буфера, отметив, что у вас есть буфер 500, но только скажите, что в наличии 50, что может быть ошибка, иначе вам нужно больше логики c, чтобы добавить больше буфера.

...