скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Формат архивного файла 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 * старший номер версии + младший номер версии.





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook