Формат архивного файла RAR
Оформил: DeeCo
(ОПИСЫВАЕМЫЙ ФОРМАТ АРХИВА ДЕЙСТВИТЕЛЕН ДЛЯ
RAR ВЕРСИИ 1.50 И СТАРШЕ)
Файл архива состоит из блоков разной
длины. Порядок следования этих блоков может меняться, но первым блоком всегда
должен быть блок-маркер, за которым следует блок заголовка
архива.
Каждый блок начинается со следующих полей:
HEAD_CRC 2
байта CRC всего блока или его части HEAD_TYPE 1 байт Тип блока HEAD_FLAGS
2 байта Флаги блока HEAD_SIZE 2 байта Размер блока ADD_SIZE 4 байта
Необязательное поле - добавление к размеру блока
Поле ADD_SIZE
присутствует, только если (HEAD_FLAGS & 0x8000) != 0
Общий размер
блока указан в поле HEAD_SIZE, если (HEAD_FLAGS & 0x8000) == 0 или
HEAD_SIZE+ADD_SIZE, если есть поле ADD_SIZE, при этом (HEAD_FLAGS &
0x8000) != 0.
Во всех блоках следующие биты в HEAD_FLAGS имеют одинаковое
значение:
0x4000 - если установлен, то старые версии RAR будут
игнорировать этот блок и удалять его при изменении архива; если не
установлен, то блок копируется в новый архивный файл при изменении
архива;
0x8000 - если установлен, то поле ADD_SIZE присутствует и размер
полного блока составляет HEAD_SIZE+ADD_SIZE.
Заявленные типы
блоков:
HEAD_TYPE=0x72 блок-маркер HEAD_TYPE=0x73 заголовок
архива HEAD_TYPE=0x74 заголовок файла HEAD_TYPE=0x75 заголовок
комментария HEAD_TYPE=0x76 дополнительная информация HEAD_TYPE=0x77
субблок HEAD_TYPE=0x78 информация для восстановления
Блок комментария
используется только внутри других блоков.
Обработка архива происходит
следующим образом:
1. Читается и проверяется блок-маркер 2. Читается
заголовок архива 3. Читаются или пропускаются HEAD_SIZE-размер(MAIN_HEAD)
байт 4. Если обнаружен конец архива, то обработка архива прекращается,
иначе читаются 7 байт в полях HEAD_CRC, HEAD_TYPE, HEAD_FLAGS,
HEAD_SIZE. 5. Проверяется HEAD_TYPE. Если надо прочитать блок: если
HEAD_TYPE==0x74 прочитать заголовок файла (первые 7 байт уже
прочитаны) прочитать или пропустить HEAD_SIZE-размер(FILE_HEAD)
байт прочитать или пропустить FILE_SIZE байт иначе прочитать
соответствующий блок HEAD_TYPE: прочитать HEAD_SIZE-7 байт если
(HEAD_FLAGS & 0x8000) прочитать ADD_SIZE байт Если надо пропустить
блок: пропустить HEAD_SIZE-7 байт если (HEAD_FLAGS &
0x8000) пропустить ADD_SIZE байт 6. Перейти к шагу
4. ========================================================================== Форматы
блоков ========================================================================== Блок-маркер
(MARK_HEAD) ~~~~~~~~~~~~~~~~~~~~~~~ HEAD_CRC Всегда 0x6152 2
байта HEAD_TYPE Тип заголовка: 0x72 1 байт HEAD_FLAGS Всегда
0x1a21 2 байта HEAD_SIZE Размер блока = 0x0007 2 байта Блок-маркер в
действительности считается фиксированной последовательностью байт: 0x52 0x61
0x72 0x21 0x1a 0x07 0x00
Заголовок архива
(MAIN_HEAD) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HEAD_CRC CRC полей от HEAD_TYPE
до RESERVED2 2 байта HEAD_TYPE Тип заголовка: 0x73 1 байт HEAD_FLAGS
Битовые флаги: 2 байта 0x01 - Атрибут тома (том многотомного
архива) 0x02 - Присутствует архивный комментарий 0x04 - Атрибут блокировки
архива 0x08 - Атрибут непрерывного (solid) архива 0x10 - Не
используется 0x20 - Присутствует авторская подпись (AV) остальные биты в
HEAD_FLAGS зарезервированы для внутреннего использования
HEAD_SIZE
Общий размер архивного заголовка, включая архивные 2 байта
комментарии RESERVED1 Зарезервировано 2 байта RESERVED2
Зарезервировано 4 байта Блок комментария присутствует, если (HEAD_FLAGS
& 0x02) != 0
Заголовок файла (файл в
архиве) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HEAD_CRC CRC полей от HEAD_TYPE до
FILEATTR и имени файла 2 байта HEAD_TYPE Тип заголовка: 0x74 1
байт HEAD_FLAGS Битовые флаги: 2 байта 0x01 - файл продолжается из
предыдущего тома 0x02 - файл продолжается в следующем томе 0x04 - файл
зашифрован паролем 0x08 - присутствует комментарий файла 0x10 -
используется информация из предыдущих файлов (флаг непрерывности) (для RAR
2.0 и выше) биты 7 6 5 (для RAR 2.0 и выше) 0 0 0 - размер словаря 64
Кбайт 0 0 1 - размер словаря 128 Кбайт 0 1 0 - размер словаря 256
Кбайт 0 1 1 - размер словаря 512 Кбайт 1 0 0 - размер словаря 1024
Кбайт 1 0 1 - зарезервировано 1 1 0 - зарезервировано 1 1 1 - файл в
каталоге (HEAD_FLAGS & 0x8000) == 1, так как полный размер блока
составляет HEAD_SIZE + PACK_SIZE HEAD_SIZE Полный размер заголовка файла,
включая имя файла и комментарии 2 байта PACK_SIZE Размер файла в архиве
(сжатый) 4 байта UNP_SIZE Размер исходного файла (несжатый) 4
байта HOST_OS Использованная при архивировании операционная система 1 байт
0 - MS-DOS 1 - OS/2 2 - Win32 3 - Unix 4 - Mac OS FILE_CRC CRC
файла 4 байта FTIME Дата и время в стандартном формате MS-DOS 4
байта UNP_VER Версия RAR, необходимая для извлечения файла 1
байт METHOD Метод сжатия 1 байт NAME_SIZE Размер имени файла 2
байта ATTR Атрибуты файла 4 байта FILE_NAME Имя файла - строка размером
NAME_SIZE байт
Блок комментария присутствует, если (HEAD_FLAGS &
0x08) != 0
Блок комментария ~~~~~~~~~~~~~~~~ HEAD_CRC CRC полей от
HEAD_TYPE до COMM_CRC 2 байта HEAD_TYPE Тип заголовка: 0x75 1
байт HEAD_FLAGS Битовые флаги 2 байта HEAD_SIZE Размер заголовка
комментария + размер комментария 2 байта UNP_SIZE Размер несжатого
комментария 2 байта UNP_VER Версия RAR, необходимая для извлечения
комментария 1 байт METHOD Метод сжатия 1 байт COMM_CRC CRC
комментария 2 байта COMMENT Текст комментария
Блок дополнительной
информации ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HEAD_CRC CRC блока 2
байта HEAD_TYPE Тип заголовка: 0x76 1 байт HEAD_FLAGS Битовые
флаги 2 байта HEAD_SIZE Общий размер блока 2 байта INFO Прочие
данные
Субблок ~~~~~~~ Объект в архиве (блок или заголовок) может
сопровождаться субблоком. Субблок зависит от основного объекта. Субблок может
быть удален или перемещен в новой версии архива при его
обновлении. Субблок содержит следующие поля: HEAD_CRC CRC блока 2
байта HEAD_TYPE Тип заголовка: 0x77 1 байт HEAD_FLAGS Битовые
флаги 2 байта (HEAD_FLAGS & 0x8000) == 1, так как полный размер
блока составляет HEAD_SIZE + DATA_SIZE HEAD_SIZE Общий размер блока 2
байта DATA_SIZE Общий размер данных 4 байта SUB_TYPE Тип субблока 2
байта RESERVED Должно быть 0 1 байт Другие поля Другие поля в
зависимости от типа субблока
Субблок расширенных атрибутов
OS/2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HEAD_CRC CRC блока 2
байта HEAD_TYPE Тип заголовка: 0x77 1 байт HEAD_FLAGS Битовые
флаги 2 байта (HEAD_FLAGS & 0x8000) == 1, так как полный размер
блока составляет HEAD_SIZE + DATA_SIZE HEAD_SIZE Общий размер блока 2
байта DATA_SIZE Общий размер данных (сжатый размер расширенных
атрибутов) 4 байта SUB_TYPE 0x100 2 байта RESERVED Должно быть
0 1 байт UNP_SIZE Размер несжатых расширенных атрибутов 4
байта UNP_VER Версия RAR, необходимая для извлечения расширенных
атрибутов 1 байт METHOD Метод сжатия 1 байт EA_CRC CRC расширенных
атрибутов 4
байта ========================================================================== Примечания ========================================================================== 1.
Для обработки SFX-архива нужно пропустить модуль SFX, для чего в
архиве осуществляется поиск блока-маркера. В модуле SFX нет
последовательности байтов блока-маркера (0x52 0x61 0x72 0x21 0x1a 0x07
0x00). 2. CRC вычисляется с помощью стандартного многочлена 0xEDB88320. В
случае, если размер CRC меньше 4 байт, то используются только младшие
байты. 3. Кодирование метода сжатия: 0x30 - сохранение (без
сжатия) 0x31 - скоростное сжатие 0x32 - быстрое сжатие 0x33 -
нормальное сжатие 0x34 - хорошее сжатие 0x35 - лучшее сжатие 4. Номер
версии RAR, необходимой для извлечения, кодируется как 10 * старший номер
версии + младший номер версии.
|