Формат архивного файла RARDelphi , Файловая система , Форматы файловФормат архивного файла RAR
Оформил: DeeCo Файл архива состоит из блоков разной длины. Порядок следования этих блоков может меняться, но первым блоком всегда должен быть блок-маркер, за которым следует блок заголовка архива. Каждый блок начинается со следующих полей: 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 * старший номер версии + младший номер версии. Статья Формат архивного файла RAR раздела Файловая система Форматы файлов может быть полезна для разработчиков на Delphi и FreePascal. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Форматы файлов ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |