﻿
               RAR версия 3.62 - Техническая информация
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


ОПИСЫВАЕМЫЙ ФОРМАТ АРХИВА ДЕЙСТВИТЕЛЕН ТОЛЬКО ДЛЯ RAR ВЕРСИИ 1.50 И СТАРШЕ

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

Файл архива состоит из блоков разной длины. Порядок следования этих блоков
может меняться, но первым блоком всегда должен быть блок-маркер, за которым
следует блок заголовка архива.

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

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          информация для восстановления старого типа
HEAD_TYPE=0x79          электронная подпись старого типа
HEAD_TYPE=0x7a          субблок

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

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

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) байт
     Если (HEAD_FLAGS & 0x100)
       прочитать или пропустить HIGH_PACK_SIZE*0x100000000+PACK_SIZE байт
     иначе
       прочитать или пропустить FILE_SIZE байт
     иначе
       прочитать соответствующий блок HEAD_TYPE:
         прочитать 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 байта
                0x0001  - Атрибут тома (том многотомного архива)
                0x0002  - Присутствует архивный комментарий
                          RAR 3.x использует отдельный блок комментария
                          и не устанавливает этот флаг.

                0x0004  - Атрибут блокировки архива
                0x0008  - Атрибут непрерывного (solid) архива
                0x0010  - Новая схема именования томов ('volname.partN.rar')
                0x0020  - Присутствует информация об авторе или
                          электронная подпись (AV)
                          RAR 3.x не устанавливает этот флаг.

                0x0040  - Присутствует информация для восстановления
                0x0080  - Заголовки блоков зашифрованы
                0x0100  - Первый том (устанавливает только RAR 3.0 и старше)


                Остальные биты в HEAD_FLAGS зарезервированы для
                внутреннего использования

HEAD_SIZE       Общий размер архивного заголовка, включая архивные
2 байта         комментарии

RESERVED1       Зарезервировано
2 байта

RESERVED2       Зарезервировано
4 байта



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

HEAD_CRC        CRC полей от HEAD_TYPE до FILEATTR и имени файла
2 байта

HEAD_TYPE       Тип заголовка: 0x74
1 байт

HEAD_FLAGS      Битовые флаги:
2 байта
                0x01 - файл продолжается из предыдущего тома
                0x02 - файл продолжается в следующем томе
                0x04 - файл зашифрован паролем

                0x08 - присутствует комментарий файла
                       RAR 3.x использует отдельный блок комментария
                       и не устанавливает этот флаг.

                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    - размер словаря 2048 KB
                     1 1 0    - размер словаря 4096 KB
                     1 1 1    - файл является каталогом

               0x100 - присутствуют поля HIGH_PACK_SIZE и HIGH_UNP_SIZE.
                       Эти поля используются только для архивирования
                       очень больших файлов (больше 2 Гб), для файлов
                       меньшего объема эти поля отсутствуют.

               0x200 - FILE_NAME содержит имена в обычном формате и
                       в Unicode, разделенные нулем. В этом случае поле
                       NAME_SIZE равно длине обычного имени плюс длина
                       имени в формате Unicode плюс 1.

                       Если этот флаг присутствует, а FILE_NAME не содержит
                       нулевых байт, это означает, что имя файла закодировано
                       в формате UTF-8.

               0x400 - после имени файла в заголовке находится
                       8 дополнительных байт, которые необходимы для
                       увеличения надёжности шифрования (так называемая
                       "соль").

               0x800 - флаг версии. Это старая версия файла, номер
                       версии добавлен к имени файла как ';n'.

              0x1000 - присутствует поле расширенного времени.

              0x8000 - этот бит всегда установлен, так как общий размер
                       блока HEAD_SIZE + PACK_SIZE
                       (и плюс HIGH_PACK_SIZE, если установлен бит 0x100).

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
                     5 - BeOS

FILE_CRC        CRC файла
4 байта

FTIME           Дата и время в стандартном формате MS-DOS
4 байта

UNP_VER         Версия RAR, необходимая для извлечения файла
1 байт
                Номер версии кодируется как
                10 * старший номер версии + младший номер версии.

METHOD          Метод сжатия
1 байт
                0x30 - сохранение без сжатия
                0x31 - скоростное сжатие
                0x32 - быстрое сжатие
                0x33 - обычное сжатие
                0x34 - хорошее сжатие
                0x35 - максимальное сжатие

NAME_SIZE       Размер имени файла
2 байта

ATTR            Атрибуты файла
4 байта

HIGH_PACK_SIZE  Старшие 4 байта 64-битного значения размера сжатого файла.
4 байта         Необязательное значение, которое присутствует, только если
                установлен бит 0x100 в HEAD_FLAGS

HIGH_UNP_SIZE   Старшие 4 байта 64-битного значения размера несжатого файла.
4 байта         Необязательное значение, которое присутствует, только если
                установлен бит 0x100 в HEAD_FLAGS

FILE_NAME       Имя файла - строка размером NAME_SIZE байт

SALT            Присутствует, если (HEAD_FLAGS & 0x400) != 0
8 байт

EXT_TIME        Присутствует, если (HEAD_FLAGS & 0x1000) != 0
переменный размер

**********************
    -ts<m,c,a>[N]
            Сохранить/восстановить время файла (изменения, создания, доступа).

            Ключ -tsm служит для сохранения времени изменения файла,
            ключ -tsc сохраняет время создания, а -tsa - время последнего
            доступа. После ключа можно указывать необязательный числовой
            параметр от 0 до 4, определяющий точность обработки времени.
            Значение '1' означает точность, равную 1 секунде,
            значение '2' - 0,0065536 с, '3' - 0,0000256 с, а '4' или '+'
            включают максимальную точность времени для файловой системы NTFS,
            равную 0,0000001 с. Указание '0' или '-' означает отказ от
            сохранения времен создания и последнего доступа, а также
            низкую (двухсекундную) точность времени изменения файла.
            Высокоточные режимы добавляют в архив дополнительные данные,
            до 19 байт на каждый файл в случае применения сочетания ключей
            -tsm4 -tsa4 -tsc4. Если точность не указана, RAR использует
            значение '4' (наивысшее).

            По умолчанию RAR использует режим -tsm4 -tsc0 -tsa0, т.е. время
            модификации сохраняется с наивысшей точностью, а остальные поля
            времени игнорируются.

            Чтобы установить время создания и последнего доступа при
            распаковке файлов, нужно указать ключи -tsc и -tsa (точность
            здесь не имеет значения, но она не должна быть равна 0).
            По умолчанию RAR устанавливает только время модификации (даже
            если в архиве сохранены времена создания и доступа). Установку
            времени модификации для распаковываемых файлов также можно
            запретить, указав ключ -tsm-.

            Если требуется применить одинаковую точность ко всем трем полям
            времени, допускается не указывать букву типа времени. Например,
            сочетание ключей -tsm4 -tsa4 -tsc4 можно заменить на -ts4, -ts+
            или -ts.
            Чтобы сохранить только время модификации с низкой точностью или
            чтобы игнорировать все три времени при распаковке, используйте
            ключ -ts-.

            При создании архива RAR автоматически уменьшает точность в
            соответствии с той, которая поддерживается файловой системой.
            Для FAT точность не превышает 2 с, для UNIX - 1 с.
            Точность времени в системе NTFS составляет 0,0000001 с.

            При распаковке установка полей времени зависит от операционной
            системы. Windows позволяет устанавливать все три типа времени,
            UNIX - только времена модификации и последнего доступа, но
            не создания файла, а DOS поддерживает только время модификации.

            Примеры:

            1) rar a -ts backup

            Сохранить все времена файлов с максимально высокой точностью.

            2) rar x -tsa backup

            Восстановить у файлов времена модификации и последнего доступа.
            Ключ -tsm можно не указывать, так как RAR использует его
            по умолчанию.

            3) rar a -tsm1 -tsc1 backup

            Сохранить времена модификации и создания с низкой точностью.
            Без ключа -tsm1 было бы сохранено время модификации с высокой
            точностью.

rar a -m0 -ts test test.txt
                     Display of File TEST.RAR

        MARK_HEAD
000000: 52 61 72 21 1A 07 00                             Rar!...
                             MAIN_HEAD
                             CF  90                                          HEAD_CRC
                                    73                                       HEAD_TYPE
                                       00 00                                 HEAD_FLAGS
                                             0D 00                           HEAD_SIZE
                                                   00 00        ..s......    RESERVED1
000010: 00 00 00 00                                                          RESERVED2

                    FC A1                                                    HEAD_CRC
                          74                                                 HEAD_TYPE
                             20  90                                          HEAD_FLAGS
                                                                               128 Кб
                                                                               0x1000 - присутствует поле расширенного времени.

                                                                               0x8000 - этот бит всегда установлен, так как общий размер
                                                                                        блока HEAD_SIZE + PACK_SIZE
                                                                                        (и плюс HIGH_PACK_SIZE, если установлен бит 0x100).
                                    3B 00                                    HEAD_SIZE
                                          04 00 00 00                        PACK_SIZE
                                                      04 ......t .;......    UNP_SIZE
000020: 00 00 00
                 02                                                          HOST_OS  - Win32
                    B8 93 EA EE                                              FILE_CRC
                                 39 A1 C1 2E                                 FTIME
                                             14                              UNP_VER
                                                30                           METHOD - 0x30 - сохранение без сжатия
                                                   08 00 ........9....0..    NAME_SIZE
000030: 20 20 00 00                                                          ATTR
                    74 65 73 74  2E 74 78 74             ..test.txt....      FILE_NAME - "test.txt"
                                             F0 FB                           EXT_TIME
                                                   1C A3
000040: 68
         { 37 A1 C1 2E
                       46 18 7E }
                               { 39 A1 C1 2E
                                             1C A3 68 }
                                                      54 h7...F.~9.....hT
000050: 45 53 54                                         EST

                 C4 3D 7B 00 40  07 00                      .={.@........


> каков формат сабжа в rar-архиве.

Он довольно сложный - сначала два байта флагов, описывающих,
какие поля присутствуют (mtime,ctime,atime,arctime). 4 бита
на поле. Если установлен первый бит - присутствуют 4 байта
времени в досовском формате. Кроме mtime, для которого DOS time
есть всегда в основном заголовке.

Если установлен второй бит - к досовскому времени нужно прибавить
одну секунду. Следующие 2 бита - количество дополнительных
байтов, описывающих дробную часть времени (меньше секунды).
Первый байт - старший, в нем каждая единичка это 65536/10000000
секунды, единичка во втором содержит 256/10000000, единичка
в третьем 1/10000000.

После флагов (4 раза по 4 бита) все эти доп. байты и идут,
если есть. Поле arctime на данный момент не используется,
в перспективе тут может быть записано время упаковки.

> В доках написано только
> ------------------------------------------------------>8----
> EXT_TIME        Присутствует, если (HEAD_FLAGS & 0x1000) != 0
> переменный размер
> ----8<------------------------------------------------------

> или это пока недокуметировано?

Только в исходниках unrar. Например, поищи LHD_EXTTIME в arcread.cpp.
**********************


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


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

1. Для обработки SFX-архива требуется пропустить модуль SFX и найти
   в архиве блок-маркер. В самом SFX-модуле последовательность байтов
   блока-маркера (0x52 0x61 0x72 0x21 0x1a 0x07 0x00) отсутствует.

2. CRC вычисляется с помощью стандартного полинома 0xEDB88320. В случае
   если размер CRC меньше 4 байт, используются только младшие байты.
