# bzip2

Библиотека сжатия данных, реализующая алгоритм блочного сортирующего преобразования Барроуза-Уилера (BWT) с последующим применением преобразования движущегося префикса (MTF) и кодирования Хаффмана. Библиотека предоставляет программный интерфейс для сжатия и распаковки данных с использованием многоуровневой блочной архитектуры, где каждый блок обрабатывается независимо, что обеспечивает устойчивость к повреждениям и возможность потоковой обработки.

## Особенности

- реализация алгоритма Барроуза-Уилера для группировки повторяющихся символов перед кодированием;
- многоступенчатый конвейер обработки: BWT → MTF → RLE → кодирование Хаффмана;
- поддержка девяти уровней сжатия, регулирующих размер блока (от 100 до 900 КБ);
- блочная организация с независимой распаковкой каждого сегмента данных;
- низкоуровневый API для потоковой обработки и высокоуровневые функции для работы с буферами.

## Основные компоненты

Библиотека bzip2 предоставляет API для программного управления процессом сжатия и распаковки (подробнее с документацией можно ознакомиться [здесь](https://sourceware.org/bzip2/docs.html)):

### Потоковое сжатие

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

- `BZ2_bzCompressInit()` — инициализация структуры `bz_stream` для сжатия с указанием уровня (1-9) и параметров;
- `BZ2_bzCompress()` — обработка блока данных с поддержкой режимов `BZ_RUN`, `BZ_FLUSH`, `BZ_FINISH`;
- `BZ2_bzCompressEnd()` — завершение сжатия и освобождение внутренних структур;
- `BZ2_bzWriteOpen()`, `BZ2_bzWrite()`, `BZ2_bzWriteClose()` — обёртки для интеграции с файловым вводом-выводом.

### Потоковая распаковка

Интерфейс для последовательной декомпрессии потоков bzip2, также использующий структуру bz_stream. Обеспечивает пошаговое чтение и распаковку сжатых данных с возвратом состояний обработки, обработкой ошибок формата и поддержкой частичного чтения блоков. Позволяет интегрировать декомпрессию в пайплайны обработки данных.

- `BZ2_bzDecompressInit()` — подготовка структуры bz_stream для распаковки;
- `BZ2_bzDecompress()` — декомпрессия блока данных с возвратом кодов состояния;
- `BZ2_bzDecompressEnd()` — завершение работы декомпрессора;
- `BZ2_bzReadOpen()`, `BZ2_bzRead()`, `BZ2_bzReadClose()` — высокоуровневые функции для поточного чтения сжатых файлов.

### Работа с буферами

Высокоуровневый синхронный интерфейс для работы с данными в оперативной памяти. Предоставляет функции единого вызова для полного сжатия/распаковки буферов, скрывая детали потоковой обработки.

- `BZ2_bzBuffToBuffCompress()` — сжатие буфера целиком за один вызов;
- `BZ2_bzBuffToBuffDecompress()` — распаковка буфера целиком за один вызов.

### Константы и коды состояния

Набор предопределённых значений для управления работой библиотеки и диагностики. Включает: коды возврата операций (успех, продолжение, завершение), коды ошибок (параметры, память, данные, ввод-вывод), уровни сжатия (размеры блоков 100-900 КБ) и параметры алгоритма (детализация вывода, порог сложности данных).

- **Коды возврата**: `BZ_OK`, `BZ_RUN_OK`, `BZ_FLUSH_OK`, `BZ_FINISH_OK`, `BZ_STREAM_END`;
- **Коды ошибок**: `BZ_SEQUENCE_ERROR`, `BZ_PARAM_ERROR`, `BZ_MEM_ERROR`, `BZ_DATA_ERROR`, `BZ_DATA_ERROR_MAGIC`, `BZ_IO_ERROR`, `BZ_UNEXPECTED_EOF`, `BZ_OUTBUFF_FULL`;
- **Уровни сжатия**: от 1 (минимальное сжатие, 100КБ блок) до 9 (максимальное сжатие, 900КБ блок);
- **Параметры алгоритма**: `verbosity` (детальность отладочного вывода), `workFactor` (порог для fallback-алгоритма при сложных данных).
