Руководство по библиотеке zlib 1.1.4


Содержание

  1. Пролог
  2. Введение
  3. Прикладные функции
  4. Основные функции
  5. Расширенные функции
  6. Функции подсчета контрольных сумм
  7. Структура z_stream_s
  8. Константы
  9. Разное
Свадебный салон Эльза.

Пролог

'zlib' библиотека для сжатия общего назначения версии 1.1.4, 11 марта 2002 года

Copyright (C) 1995-2005 Jean-loup Gailly и Mark Adler

Эта библиотека поставляется 'как есть', без каких-либо явных или подразумеваемых гарантий. Ни при каких обстоятельствах авторы не несут какой-либо ответственности в случае потери данных вследствие использования данной библиотеки.

Разрешается всем использовать эту библиотеку для любых целей, в том числе и для коммерческих приложений, а также изменять ее и распространять свободно при соблюдении следующих условий:

  1. Оригинал библиотеки не должен быть искажен; вы не должны заявлять, что именно вы написали оригинальную библиотеку. Если вы используете эту библиотеку в своем программном продукте, то ссылка на авторов библиотеки была бы желательна, но это не является обязательным требованием.
  2. Измененные версии исходных текстов должны быть отчетливо маркированы и не должны выдаваться за оригинал библиотеки.
  3. Эти замечания не могут быть удалены либо изменены при каком-либо варианте распространения исходных текстов.
Jean-loup Gailly
jloup@gzip.org
Mark Adler
madler@alumni.caltech.edu
Формат данных, который используется библиотекой zlib, описан в RFC (Request for Comments) с 1950 по 1952 в файлах rfc1950.txt (zlib формат), rfc1951.txt (формат сжатия) и rfc1952.txt (gzip формат).

Это руководство создано на основе zlib.h, автор - piaip , перевел на русский Н.Онищук.

Посетите http://www.zlib.org - официальный сайт библиотеки zlib.


Введение

Библиотека сжатия 'zlib' предоставляет функции компрессии и декомпрессии в памяти, включая проверку целостности несжатых данных. Эта версия библиотеки поддерживает только один метод сжатия (дефляцию), в последствии другие алгоритмы будут добавлены с тем же потоковым интерфейсом.

Сжатие может быть выполнено за один проход, если буферы достаточно большие (к примеру, если входной файл проецируется в память), или же сжатие может быть выполнено путем многократных вызовов функции компрессии. В последнем случае приложение должно обеспечить несколько больший входной буфер и возможно больший выходной буфер перед каждым вызовом функции компрессии.

Библиотека также поддерживает чтение и запись файлов в формате gzip (.gz) с интерфейсом похожим на используемый в stdio.

Библиотека не инсталлирует каких-либо хуков, обработчиков сигналов и сообщений. Декодер проверяет структуру компрессованных данных, так что библиотека не рухнет, даже если ей на вход будут поданы искаженные данные.


Прикладные функции

Нижеследующие прикладные функции реализованы на основе
основных потоко-ориентированных функций. Чтобы упростить интерфейс, некоторые опции заменены предопределенными значениями (степень сжатия, объем используемой памяти, стандартные функции распределения памяти). Исходный код этих прикладных функций может быть легко модифицирован, если вам понадобятся какие-либо специальные опции.

Перечень функций

Описание функций

int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
Сжимает данные из исходного буфера в буфер назначения. sourceLen содержит длину в байтах исходного буфера. Перед вызовом функции, destLen должен содержать максимальный размер буфера назначения, который должен быть по крайней мере на 0.1% больше чем sourceLen плюс 12 байт. После вызова функции, destLen содержит актуальный размер сжатого буфера.
Эта функция может быть использована для компрессии всего файла за один проход, если этот входной файл спроецирован в память.
Функция compress возвращает:

int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level);
Сжимает данные из исходного буфера в буфер назначения. Параметр level имеет то же значение, что и в deflateInit. sourceLen содержит длину в байтах исходного буфера. Перед вызовом функции, destLen должен содержать максимальный размер буфера назначения, который должен быть по крайней мере на 0.1% больше чем sourceLen плюс 12 байт. После вызова функции, destLen содержит актуальный размер сжатого буфера.
Функция compress2 возвращает:

int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
Декомпрессирует исходный буфер в буфер назначения. sourceLen содержит длину в байтах исходного буфера. Перед вызовом функции, destLen должен содержать максимальный размер буфера назначения, который должен быть достаточно большим, чтобы вместить полностью несжатые данные. (Размер несжатых данных должен быть предварительно сохранен компрессором и передан декомпрессору посредством других способов, описание которых выходит за рамки данной библиотеки.) После вызова функции, destLen содержит актуальный размер несжатых данных.
Эта функция может быть использована для всего файла за один проход, если этот файл спроецирован в память.
Функция uncompress возвращает:

typedef voidp gzFile;

gzFile gzopen (const char *path, const char *mode);
Открывает gzip (.gz) файл для чтения или записи. Режим открытия задается также, как и у функции fopen ("rb" или "wb") но кроме этого может также включать степень сжатия ("wb9") или стратегию: 'f' для отфильтрованных данных ("wb6f"), 'h' для сжатия только по Хаффману ("wb1h"). Более подробно параметры выбора стратегии описаны в функции deflateInit2.
Функция gzopen может также применяться для чтения файлов не в формате gzip, в этом случае gzread будет читать данные из файла напрямую, без декомпрессии.
Функция gzopen возвращает NULL, если файл не может быть открыт или если недостаточно памяти для компрессии\декопрессии. В переменной errno будет выставлено соответствующее состояние, т.о. можно распознать эти 2 случая (Если errno равна 0, то это соответствует ошибке zlib Z_MEM_ERROR).

gzFile gzdopen (int fd, const char *mode);
Функция gzdopen() ассоциирует gzFile с дескриптором fd. Дескрипторы файлов получают вызовом функций вроде open, dup, creat, pipe или fileno (в случае, если файл был предварительно открыт с помощью fopen). Параметр mode такой же, как и в gzopen.
Если впоследствии вызвать gzclose с возвращенным значением gzFile, то будет также закрыт и файл с дескриптором fd, подобно вызову fclose(fdopen(fd), mode). Если же нужно сохранить файл fd открытым, используйте gzdopen(dup(fd), mode).
Функция gzdopen возвращает NULL, если недостаточно памяти для компрессии\декопрессии.

int gzsetparams (gzFile file, int level, int strategy);
Динамически обновляет степень сжатия или стратегию. Что означают эти параметры можно посмотреть в описании функции deflateInit2.
Функция gzsetparams возвращает:

int gzread (gzFile file, voidp buf, unsigned len);
Читает переданное количество байт несжатых данных из компресованного файла. Если входной файл не в формате gzip, то gzread просто копирует переданное ей количество байт в буфер.
Функция gzread возвращает количество байт некомпрессованных данных реально прочитанных из файла (0 для конца файла и -1 в случае ошибки).

int gzwrite (gzFile file, const voidp buf, unsigned len);
Записывает переданное количество байт несжатых данных в компресованный файл.
Функция gzwrite возвращает реальное количество байт несжатых данных, которое было записано в файл. (0 в случае ошибки).

int VA gzprintf (gzFile file, const char *format, ...);
Конвертирует, форматирует и записывает аргументы в сжатый gzFile файл, в соответствии форматной строкой, подобно fprintf.
Функция gzprintf возвращает реальное количество байт несжатых данных, которое было записано в файл. (0 в случае ошибки).

int gzputs (gzFile file, const char *s);
Записывает передаваемую строку (заканчивающуюся нулевым символом) в сжатый файл. Последний нулевой символ не записывается.
Функция gzputs возвращает количество записанных символов, или -1 в случае ошибки.

char * gzgets (gzFile file, char *buf, int len);
Читает данные из сжатого файла, пока не будет прочитано len-1 символов, или не встретиться символ перевода каретки, который скопируется в буфер, или не будет достигнут конец файла, строка в этом случае будет заканчиваться нулевым символом.
Функция gzgets возвращает buf, или Z_NULL in case of error.

int gzputc (gzFile file, int c);
Записывает в сжатый файл параметр c, конвертируя его в unsigned char.
Функция gzputc возвращает значение, которое было записано или -1 в случае ошибки.

int gzgetc (gzFile file);
Читает один байт из сжатого файла.
Функция gzgetc возвращает прочитанный байт или -1 в случае ошибки или достижения конца файла.

int gzflush (gzFile file, int flush);
Сбрасывает все буферы записи в сжатый файл. Параметр flush такой же, что и в функции deflate(). Возвращаемое значение - код ошибки zlib (см. функцию gzerror ниже).
Функция gzflush возвращает Z_OK если параметр flush установлен в Z_FINISH и если все буфера могут быть сброшены.
Функция gzflush должна вызываться только в случаях крайней необходимости, т.к. она может ухудшить компрессию.

z_off_t gzseek (gzFile file, z_off_t offset, int whence);
Устанавливает начальную позицию для последующего вызова gzread или gzwrite на заданном сжатом файле. Параметр offset представляет количество байт в несжатом потоке данных. Параметр whence такой же, что и в lseek(2); значение SEEK_END не поддерживается.
Если файл открыт для чтения, эта функция эмулируется, что может происходить чрезвычайно медленно. Если файл открыт для записи, то поддерживается только смещение вперед. Если при сжатии gzseek попадется последовательность нулей, то указатель будет смещен на новую стартовую позицию.
Функция gzseek возвращает текущее положение курсора, измеряемое в байтах от начала некомпресованного потока данных, или -1 в случае ошибки, в частности, если файл был открыт для записи и новую позицию курсора нужно расположить перед текущей позицией.

int gzrewind (gzFile file);
"Перематывает" текущий файл. Эта функция поддерживается только при чтении.
Функция gzrewind(file) эквивалентна вызову (int)gzseek(file, 0L, SEEK_SET)

z_off_t gztell (gzFile file);
Возвращает начальную позицию для следующего вызова gzread или gzwrite на данном сжатом файле. Эта позиция представляет количество байт в несжатом потоке данных.
Функция gztell(file) эквивалентна вызову gzseek(file, 0L, SEEK_CUR)

int gzeof (gzFile file);
Возвращает 1 если во время предыдущего чтения был достигнут конец файла, иначе возвращает 0.

int gzclose (gzFile file);
В случае необходимости сбрасывает в файл все открытые буфера, закрывает сжатый файл и сбрасывает все состояния (state) компрессии\декомпрессии.
Возвращает код ошибки zlib (см. функцию gzerror ниже).

const char * gzerror (gzFile file, int *errnum);
Возвращает текстовое сообщение о последней ошибке, которая произошла на заданном сжатом файле. Параметр errnum выставлен в код ошибки zlib. Если ошибка произошла на уровне файловой системы, а не в библиотеке сжатия, то errnum выставляется в Z_ERRNO и приложение может использовать errno для того, чтобы получить расширенную диагностику.


Основные функции

Перечень функций

Описание функций

const char * zlibVersion (void);
Приложение может сравнить возвращаемое значение zlibVersion и ZLIB_VERSION для большей уверенности. Если будет отличаться первый символ, то текущий код библиотеки несовместим с хедером zlib.h, используемым приложением. Эта проверка делается автоматически функциями deflateInit и inflateInit.

int deflateInit (z_streamp strm, int level);
Инциализирует для сжатия внутреннюю переменную потока state. Поля zalloc, zfree и opaque должны быть инициализированы перед вызовом. Если zalloc и zfree выставлены в Z_NULL, deflateInit обновит их т.о., чтобы использовались стандартные функции управления памятью.
Степень сжатия level должен быть выставлен в Z_DEFAULT_COMPRESSION, или находится между 0 и 9: 1 дает лучшую скорость, 9 наибольшее сжатие, 0 означает отсутствие сжатия (все входные данные просто копируются блоком за раз).
Z_DEFAULT_COMPRESSION означает компромисс по умолчанию между скоростью и степенью сжатия (текущее значение эквивалентно значению 6 параметра level).
deflateInit возвращает: msg выставляется в null, если нет никаких сообщений об ошибках.
deflateInit не выполняет никакого сжатия, сжатие выполняется функцией deflate().

int deflate (z_streamp strm, int flush);
deflate сжимает столько данных, сколько возможно и останавливается, когда входной буфер опустошается или когда переполнится выходной буфер. Может вносить некоторую задержку в пополнение выходного буфера (т.е. когда читается входной буфер без какой-либо записи в выходной) за исключением тех случаев, когда производится форсированное сбрасывание данных в буфера.
Подробная семантика описана ниже. deflate выполняет одно или несколько следующих действий: Перед вызовом deflate(), приложение должно убедиться, что хотя бы одно из этих действий (сжатие\запись) возможно, т.е. инициализированы входной или выходные буферы, а также обновлены поля avail_in или avail_out соответственно; avail_out никогда не должен равняться нулю перед вызовом функции. Приложение может читать из выходного буфера, когда захочет, к примеру, когда выходной буфер полон, (т.е. avail_out == 0), или после каждого вызова deflate(). Если deflate возвращает Z_OK с нулевым avail_out, то функцию нужно вызывать заново, предварительно обеспечив свободное место в выходном буфере, т.к. не все сжатые данные были записаны.

Если параметр flush выставлен в Z_SYNC_FLUSH, то все уже сжатые данные будут сброшены в выходной буфер, который будет выровнен по байту, т.о. что декомпрессор сможет получить доступ к этим данным в любой момент. (В частности, avail_in выставляется в ноль после вызова, если предварительно не было обеспечено достаточно места в выходном буфере.) Сбрасывание буферов может ухудшить степень сжатия для некоторых алгоритмов, поэтому применять его следует только при необходимости.

Если параметр flush выставлен в Z_FULL_FLUSH, то все буфера сбрасываются также, как и при Z_SYNC_FLUSH, переменная state сбрасывается т.о., что декомпрессия может быть возоблена с этого же место, если предыдущие сжатые данные были повреждены или требуется произвольный доступ к данным. Чрезмерно частое использование Z_FULL_FLUSH может серьезно ухудшить сжатие.

Если deflate завершилась с avail_out == 0, то необходимо вновь вызвать эту же функцию с тем же значением параметра flush и большим размером выходного буфера (с обновленным avail_out), если же сброс выходных буферов прошел успешно (deflate возвращается с ненулевым avail_out).

Если параметр flush выставлен в Z_FINISH, то обработается входной буфер, результат сбросится в выходной буфер и deflate завершится с Z_STREAM_END если было достаточно места в выходном буфере; если deflate завершилась с Z_OK, то необходимо вновь вызвать эту же функцию с Z_FINISH и большим размером выходного буфера (обновленным avail_out) но с теми же входными данными, т.е пока функция не завершится с Z_STREAM_END или не произойдет ошибка. После завершения deflate с результатом Z_STREAM_END, единственными доступными операциями над потоком являются deflateReset или deflateEnd.

Z_FINISH может быть использован сразу после deflateInit если все сжатие может быть выполнено за один вызов. В этом случае значение поля avail_out должно быть на 0.1% больше avail_in плюс 12 байт. Если deflate не вернула Z_STREAM_END, то она должна быть вызвана повторно, как было описано выше.

deflate() выставляет strm-> adler в контрольную сумма adler32 всех всех прочитанных данных (т.е, total_in байт).

deflate() может обновлять data_type если она сможет достоверно определить тип входных данных (Z_ASCII или Z_BINARY). В случае неопределенности данные рассматриваются как бинарные. Это поле является справочным и ни в коем случае не влияет на алгоритмы сжатия.

Функция deflate() возвращает:

int deflateEnd (z_streamp strm);
Освобождает память, выделенную под все динамические массивы. Эта функция разрушает данные в необработанном входном буфере и не сбрасывает результаты в выходной буфер.

Функция deflateEnd возвращает:

В случае ошибки msg может быть выставлена, но будет указывать на статическую строку (которую не нужно освобождать).

int inflateInit (z_streamp strm);
Инициализирует внутреннюю переменную потока state для декомпрессии. Поля next_in, avail_in, zalloc, zfree и opaque должны быть инициализированы приложением перед вызовом функции. Если next_in не равен Z_NULL и avail_in бостаточно большой (точное значение зависит от метода сжатия), inflateInit определяет способ сжатия по zlib заголовку и соответственным образом инициализирует все структуры; если эту функцию не вызывать, то приложение затормозится при первом вызове inflate. Если zalloc и zfree выставлены в Z_NULL, inflateInit обновит их т.о., что будут использоваться стандартные для приложения функции управления памятью.

Функция inflateInit возвращает:

msg выставляется в NULL, если нет каких-либо сообщений об ошибке. inflateInit не выполняет какой-либо декомпрессии, кроме чтения zlib заголовка, если тот присутствует. Декомпрессия осуществляется функцией inflate(). (Т.о. next_in и avail_in могут быть модифицированы, но next_out и avail_out остаются неизменными.)

int inflate (z_streamp strm, int flush);
inflate декомпрессует столько данных, сколько это возможно сделать и останавливается тогда, когда будет исчерпан входной буфер или будет переполнен выходной. Она может вносить некоторую задержку в пополнение выходного потока (когда осуществляется чтение входного потока без какого-либо сброса данных в выходной) за исключением случаев, когда используется параметр flush для сброса данных в выходной буфер.

Подробная семантика описана ниже. inflate выполняет одно или все действия:

Перед вызовом inflate(), приложение должно убедиться, что как минимум одно из действий возможно, обеспечивая данные для декомпрессии на входе, считывая результаты на выходе, и обновляя соответствующие параметры - next_* и avail_*. Приложение может считывать декомпрессованые данные на выходе когда потребуется, к примеру, когда выходной буфер станет заполнен (т.е. avail_out == 0), или после каждого вызова inflate(). Если inflate вернет Z_OK с нулевым avail_out, то функцию нужно вызвать заново, обеспечив достаточно места в выходно буфере, чтобы в него можно было записать уже декомпресованые данные.

Если параметр flush выставлен в Z_SYNC_FLUSH, то inflate сбрасывает в выходной буфер столько декомпресованых данных, сколько возможно. Поведение функции inflate не определено для значений параметра flush, отличающихся от Z_SYNC_FLUSH или Z_FINISH, хотя текущая реализация в любом случае сбрасывает столько информации в выходной буфер, сколько это возможно

Функция inflate() может вызываться до тех пор, пока не вернет Z_STREAM_END или код ошибки. Однако, если вся декомпрессия может быть произведена за за один вызов, то параметр flush должен быть выставлен в Z_FINISH. В этом случае обрабатывается весь входной буфер и все обработанные данные сбрасываются в выходной; avail_out должен быть достаточно большой, чтобы вместить все декомпресованные данные. (Для этих целей размер несжатых данных может быть сохранен компрессором). Следующая операция над потоком должна быть inflateEnd чтобы сбросить состояние декомпрессии - state. Использование параметра Z_FINISH не является обязательным, но может быть полезным для единичного вызова inflate(), что бы последняя могла оптимизировать скорость и ресурсы для декомпрессии.

Если на этом этапе потребуется словарь (см. inflateSetDictionary ниже), то функция inflate выставит strm->adler в adler32 контрольную сумму выбранного компрессором словаря и вернет Z_NEED_DICT; в противном случае функция выставит strm->adler в adler32 контрольную сумму всех декомпресованных данных (т.е. total_out байт) и вернет Z_OK, Z_STREAM_END или код ошибки, как описано ниже. В конце потока inflate() проверяет на равенство посчитанную ей adler32 контрольную сумму и такую же сумму, посчитанную компрессором и в случае совпадения возвращает Z_STREAM_END.

Функция inflate() возвращает:

Если функция вернет Z_DATA_ERROR, то приложение в последствии может вызвать inflateSync чтобы найти неповрежденный блок для декомпрессии.

int inflateEnd (z_streamp strm);
Освобождает все динамические структуры потока. Эта функция разрушает все данные во входном буфере и ничего не сбрасывает в выходной.

Функция inflateEnd возвращает:

В случае ошибки msg может быть выставлена, но будет указывать на статический буфер (который не нужно освобождать).


Расширенные функции

Эти функции могут быть востребованы только в некоторых специальных приложениях.

Перечень функций

Описание функций

int deflateInit2 (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy);
Это другая версия deflateInit с большим количеством опций компрессии. Поля next_in, zalloc, zfree и opaque должны быть инициализированы приложением до вызова функции.

Параметр method задает метод сжатия. В текущей версии библиотеки должен равняться Z_DEFLATED.

Параметр windowBits является базой двух логарифмов размера окна (размер буфера истории). Должен быть в диапазоне 8..15 для текущей версии библиотеки. Большие значения этого параметра улучшают сжатие и увеличивают объем используемой памяти. При использовании функции deflateInit этот параметр равняется 15.

Параметр memLevel определяет сколько памяти может быть распределено для внутренней переменной сжатия state. memLevel=1 использует минимум мамяти, но выполняется медленно и уменьшает степень сжатия; memLevel=9 использует максимум памяти с оптимальной скоростью сжатия. Значение по умолчанию - 8. Подробности работы с памятью и варианты использования параметров windowBits и memLevel описаны в файле zconf.h.

Параметр strategy определяет алгоритм сжатия. Используйте значение Z_DEFAULT_STRATEGY для обыкновенных данных, Z_FILTERED для данных, обработанных фильтром (или предиктором), или Z_HUFFMAN_ONLY чтобы явно указать к использованию только кодирование по Хаффману (никаких строк вообще). Отфильтрованные данные содержат главным образом малые значения с каким-то случайным распределением. В этом случае в качестве алгоритма сжатия будет использован наилучший - compress. Эффект от применения Z_FILTERED заключается в форсировании кодирования по Хаффману и меньшем использовании строкового сравнения; это что-то среднее между Z_DEFAULT и Z_HUFFMAN_ONLY. Параметр strategy влияет только на степень сжатия.

Функция deflateInit2 возвращает:

msg выставляется в NULL если не было никаких сообщений об ошибках. deflateInit2 не выполняет какой-либо компрессии: это делает deflate().

int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
Инициализирует словарь на основе указанной последовательности байт без какой-либо компрессии\декомпресии. Эта функция должна вызываться сразу после deflateInit, deflateInit2 или deflateReset, и перед первым вызовом deflate. Компрессор и декомпрессор должны использовать строго один и тот же словарь (см. inflateSetDictionary).

Словарь должен содержать строки (последовательности байт) которые будут встречаться позже в данных для компрессии. Предпочтительно, чтобы наиболее часто встречающиеся строки располагались ближе к концу словаря. Использование словаря наиболее полезно в случаях, когда данные для сжатия небольшие и могут быть спрогнозированы с хорошей точностью; в этом случае данные могут быть сжаты лучше, если сравнивать с вариантом, при котором пустой словарь.

В зависимости от размера и структуры входных данных deflateInit или deflateInit2 могут фактически игнорировать часть словаря, к примеру, если размер словаря больше, чем размер окна в deflate или deflate2. Т.о. строки, которые чаще встречаются, должны располагаться ближе к концу словаря, а не к началу.

После возвращения из этой функции strm->adler будет выставлен в Adler32 контрольную сумму словаря; декомпрессор впоследствии может использовать это значение для того, чтобы идентифицировать словарь, который был использован компрессором. (Adler32 контрольная сумма считается по всему словарю, даже если компрессор использовал только часть словаря.)

Функция deflateSetDictionary возвращает:

Функция deflateSetDictionary не выполняет какой-либо компрессии, это будет делать deflate().

int deflateCopy (z_streamp dest, z_streamp source);
Инициализизирует выходной поток как полную копию входного потока.

Эта функция может быть полезна, когда опробуется несколько стратегий сжатия, к примеру, когда входные данные разными способами предварительно обрабатываются. Потоки, которые в последствии окажутся не нужны, требуется освободить с помощью функции deflateEnd. Заметьте, что deflateCopy дублирует внутреннюю переменную state, которая может быть достаточно большой, так что такой подход может оказаться медленным и потребовать больших затрат памяти.

Функция deflateCopy возвращает:

msg остается неизменной и в входном и в выходном потоке.

int deflateReset (z_streamp strm);
Эта функция эквивалентна deflateEnd вызываемой после deflateInit, но не освобождает данные во внутренней переменной state. После вызова этой функции поток сохраняет переменную степени сжатия level и все прочие атрибуты которые были выставлены функцией deflateInit2.

Функция deflateReset возвращает:

int deflateParams (z_streamp strm, int level, int strategy);
Динамически обновляет параметры сжатия level и strategy. Смысл этих параметров такой же что и при вызове deflateInit2. Функция может использоваться к примеру в тех случаях, когда различные фрагменты входных данных могут потребовать различной стратегии. Если переменная level была изменена, то декомпрессор будет ориентироваться на старое значение до следующего вызова deflate().

Перед вызовом deflateParams, переменная потока state должна быть инициализирована также как и перед вызовом deflate(), чтобы впоследствии текущий входной поток мог быть сжат и сброшен в выходной буфер. В частности, поле strm->avail_out должно быть не нулевым.

Функция deflateParams возвращает:

int inflateInit2 (z_streamp strm, int windowBits);
Это другая версия функции inflateInit с дополнительными параметрами. Поля next_in, avail_in, zalloc, zfree and opaque должны быть инициализированы приложением перед вызовом функции.

The windowBits parameter является базой двух логарифмов максимального размера окна (размер буфера истории). Должен находится в диапазоне от 8..15 для текущей версии библиотеки. Значение по умолчанию - 15, если используется альтернативная версия функции - inflateInit. Если сжатый поток с большим размером окна подается на вход, inflate() вернется с кодом ошибки Z_DATA_ERROR вместо попытки выделить память для большего окна.

Функция inflateInit2 возвращает:

msg выставляется в NULL, если нет каких-либо сообщений об ошибке. inflateInit2 не выполняет какой-либо декомпрессии, кроме чтения zlib заголовка, если тот присутствует. Декомпрессию будет производить inflate(). (Т.о. поля next_in и avail_in могут быть модифицированы, но next_out и avail_out остануться неизменными.)

int inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength);
Инициализирует словарь для декомпрессии по заданной последовательности байт. Эта функция должна вызываться сразу после inflate, если та вернет Z_NEED_DICT. Словарь, выбранный компрессором, может быть идентифицирован по Adler32 контрольной сумме. Компрессор и декомпрессор должны использовать строго один и тот же словарь (см. deflateSetDictionary).

Функция inflateSetDictionary возвращает:

Функция inflateSetDictionary не выполняет какой-либо декомпрессии, это выполняется последующим вызовом inflate().

int inflateSync (z_streamp strm);
Пропускает неправильные фрагменты сжатых данных (см. выше описание deflate с параметром Z_FULL_FLUSH). Кроме неправильных фрагментов может пропустить также все входные данные. В выходной поток ничего не сбрасывает.

Функция inflateSync возвращает:

В случае успеха приложение может сохранить текущий указатель total_in, который будет показывать сколько правильных сжатых данных было обнаружено. В случае ошибки приложение может повторно вызвать inflateSync, подавая на вход новые данные, пока не будет найден неповрежденный фрагмент, или не закончатся данные на входе.

int inflateReset (z_streamp strm);
Эта функция эквивалентна inflateEnd вызываемой после inflateInit, но она не освобождает все массивы внутренней переменной state. Поток сохраняет все атрибуты, которые были выставлены в функции inflateInit2.

Функция inflateReset возвращает:


Функции подсчета контрольных сумм

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

Перечень функций

Описание функций

uLong adler32 (uLong adler, const Bytef *buf, uInt len);
Обновляет передаваемую Adler-32 контрольную сумму массива buf[0..len-1] и возвращает обновленную контрольную сумму. Если buf равняется NULL, функция вернет начальное значение контрольной суммы.

Adler-32 контрольная сумма так же надежна, как и посчитанная функцией CRC32, но может быть высчитана намного быстрее. Пример использования:


     uLong adler = adler32(0L, Z_NULL, 0);

     while (read_buffer(buffer, length) != EOF) {
       adler = adler32(adler, buffer, length);
     }
     if (adler != original_adler) error();
   
uLong crc32 (uLong crc, const Bytef *buf, uInt len);
Обновляет передаваемую контрольную сумму массива buf[0..len-1] и возвращает обновленную контрольную сумму. Если buf равняется NULL, функция вернет начальное значение контрольной суммы. Пример использования:

     uLong crc = crc32(0L, Z_NULL, 0);

     while (read_buffer(buffer, length) != EOF) {
       crc = crc32(crc, buffer, length);
     }
     if (crc != original_crc) error();
   

struct z_stream_s

Объявление структуры:
typedef struct z_stream_s {
    Bytef    *next_in;  /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total nb of input bytes read so far */

    Bytef    *next_out; /* next output byte should be put there */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total nb of bytes output so far */

    char     *msg;      /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: ascii or binary */
    uLong   adler;      /* adler32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream ;

typedef z_stream FAR * z_streamp;  я 
Приложение должно обновлять next_in и avail_in когда avail_in сбрасывается в ноль. Также нужно обновлять next_out и avail_out когда avail_out сбрасывается в ноль. Приложение должно инициализировать zalloc, zfree и opaque поля перед вызовом init-функций. Все остальные поля заполняются библиотекой и не должны модифицироваться приложением.

Параметр opaque, подготовленный приложением, будет передаваться в качестве первого параметра при вызове функций zalloc и zfree. Он может быть полезен при более тонком управлении потреблением памяти. Библиотека сжатия ничего о параметре opaque не знает.

zalloc должна вернуть Z_NULL если не смогла выделить достаточно памяти. Если библиотека zlib используется в многопоточном приложении, zalloc и zfree должны быть потокобезопасными.

В 16-битной системе, функции zalloc и zfree должны иметь возможность выделить вплоть до 65536 байт, не понадобиться выделять больше памяти, если будет определен макрос MAXSEG_64K (см.zconf.h). ВНИМАНИЕ: В MSDOS, указатели, возвращаемые zalloc для объектов превышающих 65536 байт *должны* иметь смещение нормализованное относительно 0. Функции выделения памяти по умолчанию из этой библиотеки обеспечивают это (см. zutil.c). Чтобы уменьшить потребление памяти и предотвратить выделение памяти для объектов свыше 64K, путем ухудшения сжатия, скомпилируйте библиотеку с ключом -DMAX_WBITS=14 (см. zconf.h).

Поля total_in и total_out могут пригодится для визуализации процесса сжатия. После сжатия, total_in содержит полный размер несжатых данных и может быть сохранен для использования декомпрессором (для частного случая, когда декомпрессию нужно будет осуществить за один вызов).


Константы

Константы идут без комментариев, только для справки.
#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1 
	/* will be removed, use Z_SYNC_FLUSH instead */
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
/* Allowed flush values ; see deflate() below for details */

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
/* Return codes for the compression/decompression functions. Negative
 * values are errors, positive values are used for special but normal events.
 */

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
/* compression levels */

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_DEFAULT_STRATEGY    0
/* compression strategy ; see deflateInit2() below for details */

#define Z_BINARY   0
#define Z_ASCII    1
#define Z_UNKNOWN  2
/* Possible values of the data_type field */

#define Z_DEFLATED   8
/* The deflate compression method (the only one supported in this version) */

#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */

#define zlib_version zlibVersion()
/* for compatibility with versions less than 1.0.2 */

Разное

deflateInit и inflateInit являются макросами, которые позволяют сравнить версию библиотеки с версией, которую компилятор обнаруживает в z_stream.

Прочие функции, которые экспортируются из библиотеки:

const char * zError (int err);
int inflateSyncPoint (z_streamp z);
const uLongf * get_crc_table (void);

Последнее обновление руководства - 13 апреля 2002
Последнее обновление перевода - 22 декабря 2005