На главную

Информация о формате:

Общая информация: Архив WinRAR. Разработан российским программистом Евгением Рошалом (отсюда и название RAR: Roshal ARchiver). Он написал программу-архиватор для упаковки/распаковки RAR, изначально под DOS, затем и для других операционных систем.
MIME-тип: application/x-rar-compressed.

Формат RAR-файла:

(основан на "RAR версия 3.70 - Техническая информация")

Описываемый формат архива действителен только для rar версии 1.50 и выше

==========================================================================
Формат архивного файла RAR
==========================================================================

Файл архива состоит из блоков разной длины.
В самом начале архива стоит блок-маркер, после которого идёт блок заголовка архива, за которым в произвольном порядке следуют блоки остальных типов.

Каждый блок начинается со следующих полей:

HEAD_CRC 2 байта CRC всего блока или его части
HEAD_TYPE 1 байт Тип блока
HEAD_FLAGS 16 бит ( =2 байта) Флаги(*) блока
HEAD_SIZE 2 байта Размер блока
ADD_SIZE 4 байта Добавление к размеру блока (необязательное поле — может отсутствовать)

Во всех блоках следующие биты в HEAD_FLAGS (*) имеют одинаковое значение:

При отсутствии поля ADD_SIZE, т.е. если (HEAD_FLAGS & 0x8000) == 0 (*) , общий размер блока указан в поле HEAD_SIZE, иначе общий размер блока равен HEAD_SIZE + ADD_SIZE.

Заявленные типы блоков (возможные значения HEAD_TYPE):

Блок комментария используется только внутри других блоков.

==========================================================================
Форматы блоков
==========================================================================

Блок-маркер (MARK_HEAD)
~~~~~~~~~~~~~~~~~~~~~~~

Блок-маркер в действительности считается фиксированной последовательностью байт: 0x52 0x61 0x72 0x21 0x1a 0x07 0x00

Заголовок архива (MAIN_HEAD)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Заголовок файла (файл в архиве)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Здесь могут быть другие новые поля

==========================================================================
Общая последовательность считывания архива
==========================================================================

Обработка архива происходит следующим образом:

1. Читается и проверяется блок-маркер;
2. Читается заголовок архива;
3. Читаются или пропускаются HEAD_SIZE байт;
4. Если обнаружен конец архива, то обработка архива прекращается, иначе читаются 7 байт в полях HEAD_CRC, HEAD_TYPE, HEAD_FLAGS, HEAD_SIZE;
5. Проверяется HEAD_TYPE:
Если HEAD_TYPE==0x74 (*) (0x74 — заголовок файла), то:
    прочитать заголовок файла (первые 7 байт уже прочитаны)
    прочитать или пропустить HEAD_SIZE байт
    Если в HEAD_FLAGS установлен 8-й бит, то:
        прочитать или пропустить HIGH_PACK_SIZE*0x100000000+PACK_SIZE байт
    иначе
        прочитать или пропустить PACK_SIZE байт
иначе
    прочитать соответствующий блок HEAD_TYPE:
        прочитать HEAD_SIZE-7 байт
        если в HEAD_FLAGS установлен 15-й бит, то:
               прочитать ADD_SIZE байт
6. Перейти к шагу 4.

==========================================================================
Примечания
==========================================================================

1. Для обработки SFX-архива требуется пропустить модуль SFX и найти в архиве блок-маркер. В самом SFX-модуле последовательность байтов блока-маркера (0x52 0x61 0x72 0x21 0x1a 0x07 0x00) отсутствует;
2. CRC вычисляется с помощью стандартного полинома 0xEDB88320(*). В случае если размер CRC меньше 4 байт, используются только младшие байты;

Примечания:

1. В интернет ВООБЩЕ НЕТ НОРМАЛЬНОГО ОПИСАНИЯ RAR-ФОРМАТА! (лишь на 5-и сайтах есть что-то, и то как под копирку, кроме zxpress.ru);
2. На сайте rarlab.com можно скачать исходники UnRAR'а, но для меня их расшифровка - довольно сложный процесс (хотя только там можно найти всю недостающюю информацию);
3. К сожалению, мне не удалось найти не только подробные спецификации формата, но и описания некоторых заголовков блоков (информация для восстановления старого типа, электронная подпись старого типа, субблок). Короче, это — только 33% от нормальных спецификаций, но лучше нигде не найти;
4. Хотелось бы отметить ресурс http://www.zxpress.ru/article.php?id=8740, на котором приведено содержание документа "Техническая информация по RAR версии 2.70", в котором можно найти описания некоторых старых типов заголовков отсутствующих на моём сайте (Блок комментария, Блок дополнительной информации, Субблок расширенных атрибутов OS/2). Так же на указанном ресурсе можно найти описание структуры заархивированного файла в архиве rar (невероятно сложное — даже не стал замарачиваться с выкладыванием на свой сайт, но если кому нужно — я указал где можно найти);
5. "CRC вычисляется с помощью стандартного полинома 0xEDB88320". На эту тему нашёл только прогу Двуреченского Павла Александровича и статью в Википедии "Циклический избыточный код".

Источники информации:

  1. http://ru.wikipedia.org/wiki/Rar (Общая информация о формате RAR);
  2. http://www.vsft.com/hal/dostime.htm (описание стандартной даты и времени в формате MS-DOS);
  3. http://www.win-rar.ru/support/knowledge/detail.php?ID=1081 (RAR версия 3.70 - Техническая информация: 3 заголовка блоков старых типов + описание структуры заархивированного файла в архиве RAR).
Сайт создан в системе uCoz