Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Формат архивного файла 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 * старший номер версии + младший номер версии.
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay