Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
Формат архивного файла RAR
ОПИСЫВАЕМЫЙ ФОРМАТ АРХИВА ДЕЙСТВИТЕЛЕН ДЛЯ 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 * старший номер
версии + младший номер версии.
|
Категория: Форматы файлов | Добавил: Angel (08.07.2008)
|
Просмотров: 498
| Рейтинг: 0.0/0 |
|
|