Я использую идею кода gzip, опубликованного в zlib. Для инициализации я использую deflateInit2(p_strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY)
. Я заархивирую поток. Каждый пакет с Z_FULL_FLUSH
, кроме из последнего, который я использую Z_FINISH
. После архивирования каждого пакета я переупорядочиваю пакеты.
данные в пакетах ---> [zip] ---> [изменение порядка] ---> ...
Если я раздую данные после архивирования, я получу точный файл перед архивированием. Если я раздую данные после переупорядочения пакетов (опять же: каждый пакет выкачивается с помощью Z_FULL_FLUSH
, кроме последнего Z_FINISH
), я получаю файл, который очень похож на исходный файл до сжатия. Разница в конце файла: в нем не хватает байтов. Это потому, что когда я его раздуваю, я получаю ошибку для последнего пакета (Z_DATA_ERROR
). Если я раздую, скажем, кусками по 50 КБ, раздутый файл после переупорядочения будет тем же файлом, что и входной, меньше ‹ 50 КБ (весь последний пакет исчез из-за ошибки). Если я уменьшу размер фрагмента наполнения до 8 байт, я все равно получу Z_DATA_ERROR
, но теперь я потеряю меньше данных при надувании (в моем примере мне не хватает одного байта из исходного файла).
Я не переупорядочиваю последний пакет (Z_FINISH
). Я попытался отправить все пакеты с Z_FULL_FLUSH
, а затем отправить еще один «пустой» пакет (только Z_FINISH
, который составляет 10 байт).
Почему это происходит? Если я использую Z_FULL_FLUSH, почему нагнетатель не может правильно его надуть? помнит ли он порядок сдутых пакетов?
Любая информация поможет, спасибо.
Z_FULL_FLUSH
... - person hudac   schedule 30.10.2013