Jaka jest struktura nagłówka programu RAR?

RAR wersja 3.20 – Informacje techniczne
FORMAT ARCHIWUM OPISANY PONIŻEJ JEST WAŻNY TYLKO DLA WERSJI OD 1.50

________________________________________
Format pliku archiwum RAR
________________________________________
Plik archiwum składa się z bloków o zmiennym rozmiarze. Rozmiar tych bloków może być różny, ale pierwszy blok musi być blokiem markującym poprzedzonym blokiem nagłówkowym archiwum.
Każdy blok zaczyna się następującymi polami:
HEAD_CRC 2 bajt CRC całego bloku lub jego części
HEAD_TYPE 1 bajt Typ bloku
HEAD_FLAGS 2 bajty Flagi bloku
HEAD_SIZE 2 bajty Rozmiar bloku
ADD_SIZE 4 bajty Pole opcjonalne – dodany rozmiar bloku
Pole ADD_SIZE występuje tylko jeśli (HEAD_FLAGS & 0x8000) != 0
Całkowity rozmiar bloku to HEAD_SIZE jeżeli (HEAD_FLAGS & 0x8000) == 0
i HEAD_SIZE+ADD_SIZE jeżeli pole ADD_SIZE występuje – kiedy
(HEAD_FLAGS & 0x8000) != 0.
W każdym bloku poniższe bity w HEAD_FLAGS mają te same znaczenia:
0x4000 – jeśli ustawione, starsze wersje programu RAR zignorują oraz usuną blok kiedy archiwum będzie zaktualizowane. Jeśli nie ustawione, blok będzie skopiowany do nowego archiwum, kiedy archiwum będzie zaktualizowane;
0x8000 – jeśli ustawione, pole ADD_SIZE jest obecne i całkowity rozmiar bloku jest równy HEAD_SIZE+ADD_SIZE
Zadeklarowane typy bloków:
HEAD_TYPE=0x72 blok markujący
HEAD_TYPE=0x73 nagłówek archiwum
HEAD_TYPE=0x74 nagłówek pliku
HEAD_TYPE=0x75 nagłówek komentarza starego typu
HEAD_TYPE=0x76 informacja o autentyczności starego typu
HEAD_TYPE=0x77 pod-blok starego typu
HEAD_TYPE=0x78 rekord odzyskiwania starego typu
HEAD_TYPE=0x79 informacja o autentyczności starego typu

HEAD_TYPE=0x7a pod-blok

Blok komentarza jest aktualnie używany tylko z innymi blokami i nie występuje on osobno.
Proces archiwizacji jest tworzony wg poniższej procedury:
1. Odczyt i sprawdzenie bloku markującego.
2. Odczyt nagłówka archiwum.
3. Odczyt lub pominięcie HEAD_SIZE-sizeof(MAIN_HEAD) bajtów
4. Jeśli wystąpi koniec archiwum wtedy proces archiwizacji zostanie przerwany, jeśli nie to zostanie wczytanych 7 bajtów do pól: HEAD_CRC, HEAD_TYPE, HEAD_FLAGS,
HEAD_SIZE.
5. Sprawdzenie HEAD_TYPE.
if HEAD_TYPE==0x74
odczyt nagłowka pliku (pierwszy 7 bajtów zostało już odczytane)
odczyt lub pominięcie HEAD_SIZE-sizeof(FILE_HEAD) bajtów
if (HEAD_FLAGS & 0x100)
odczyt lub pominięcie HIGH_PACK_SIZE*0x100000000+PACK_SIZE bajtów
else
odczyt lub pominięcie PACK_SIZE bajtów
else
odczyt odpowiednich bloków HEAD_TYPE:
odczyt HEAD_SIZE-7 bajtów
if (HEAD_FLAGS & 0x8000)
odczyt ADD_SIZE bajtów
6. idź do 4.

________________________________________
Formaty bloków________________________________________
Blok markujący ( MARK_HEAD )

HEAD_CRC Zawsze 0x6152
2 bajty
HEAD_TYPE Typ nagłówka: 0x72
1 bajt
HEAD_FLAGS Zawsze 0x1a21
2 bajty
HEAD_SIZE Rozmiar bloku = 0x0007
2 bajty
Aktualnie blok markujący jest przemyślany jako ustalona sekwencja bajtów: 0x52 0x61 0x72 0x21 0x1a 0x07 0x00

Nagłówek archiwum ( MAIN_HEAD )

HEAD_CRC CRC pól HEAD_TYPE do RESERVED2
2 bajty
HEAD_TYPE Typ nagłówka: 0x73
1 bajt
HEAD_FLAGS Flagi bitowe:
2 bajty
0x0001 – atrybut objętości (objętość archiwum)
0x0002 – komentarz archiwum jest obecny
RAR 3.x używa oddzielnych bloków komentarzy i nie ustawia tej flagi
0x0004 – atrybut blokady archiwum
0x0008 – atrybut ciągłości (archiwum ciągłe)
0x0010 – nowy schemat nazewnictwa wolumenów (\’nazwa.czesc.N.rar\’)
0x0020 – informacja o autentyczności jest obecna
RAR 3.x nie ustawia tej flagi
0x0040 – rekord odzyskiwania jest obecny
0x0080 – nagłówki bloków są zaszyfrowane
0x0100 – pierwszy wolumen (flaga ustawiana tylko przez RAR 3.0 i późniejsze)
inne bity w HEAD_FLAGS są zarezerwowane dla wewnętrznego użytku.
HEAD_SIZE Całkowity rozmiar nagłówka archiwum uwzględniający rozmiar komentarzy archiwum
2 bajty
RESERVED1 Zarezerwowany
2 bajty
RESERVED2 Zarezerwowany
4 bajty

Nagłówek pliku (plik w archiwum)

HEAD_CRC CRC pól od HEAD_TYPE do FILEATTR
2 bajty oraz nazwa pliku
HEAD_TYPE Typ nagłówka: 0x74
1 bajt
HEAD_FLAGS Flagi bitowe:
2 bajty
0x01 – plik jest kontynuowany z poprzedniego wolumenu
0x02 – plik kontynuowany w następnym wolumenie
0x04 – plik zaszyfrowany z hasłem
0x08 – komentarz pliku jest obecny
RAR 3.x używa osobnego bloku komentarza i nie ustawia tej flagi.
0x10 – informacja z poprzedniego pliku jest w użyciu (flaga ciągła)
(dla RAR 2.0 i późniejszych)
bity 7 6 5 (dla RAR 2.0 I późniejszych)
0 0 0 – rozmiar słownika 64 KB
0 0 1 – rozmiar słownika 128 KB
0 1 0 – rozmiar słownika 256 KB
0 1 1 – rozmiar słownika 512 KB
1 0 0 – rozmiar słownika 1024 KB
1 0 1 – rozmiar słownika 2048 KB
1 1 0 – rozmiar słownika 4096 KB
1 1 1 – plik jest katalogiem
0x100 – pola HIGH_PACK_SIZE oraz HIGH_UNP_SIZE
są obecne. Pola te są używane tylko przy archiwizowaniu dużych plików (większych niż 2GB), dla mniejszych plików pola te są nieobecne.
0x200 – FILE_NAME zawiera jednocześnie zwykłe i zakodowane nazwy Unicode odzielone zerem. W tym przypadku pole NAME_SIZE jest równe długości zwykłej nazwy plus zakodowanej nazwy Unicode plus 1.
0x400 – nagłówek zawiera dodatkowe 8 bajtów po nazwie pliku, które są wymagane dla zwiększenia bezpieczeństwa szyfrowania (nazywane jest to ‘salt’).
0x800 – Flaga wersji. To jest stara wersja pliku, numer wersji jest dołączony do nazwy pliku jako ‘;n’.
0x1000 – Rozszerzone pole czasu jest obecne.
0x8000 – ten bit jest zawsze ustawiony, więc rozmiar bloku jest równy HEAD_SIZE + PACK_SIZE (plus HIGH_PACK_SIZE jeśli bit 0x100 jest ustawiony).
HEAD_SIZE Całkowity rozmiar nagłówka pliku uwzględniając nazwę pliku i komentarze.
2 bajty
PACK_SIZE Rozmiar skompresowanego pliku
4 bajty
UNP_SIZE Rozmiar nie skompresowanego pliku
4 bajty
HOST_OS System operacyjny użyty do archiwizacji
1 bajt 0 – MS DOS
1 – OS/2
2 – Win32
3 – Unix
4 – Mac OS
5 – BeOS
FILE_CRC CRC pliku
4 bajty
FTIME Data i czas w standardowym formacie MS DOS
4 bajty
UNP_VER Wersja RAR potrzebna do rozpakowania pliku.
1 bajt
Numer wersji jest zakodowany jako:
10 * numer główny wersji + numer podrzędny wersji.
METHOD Metoda pakowania
1 bajt
0x30 – bez kompresji
0x31 – najszybsza kompresja
0x32 – szybka kompresja
0x33 – normalna kompresja
0x34 – dobra kompresja
0x35 – najlepsza kompresja
NAME_SIZE Rozmiar nazwy pliku
2 bajty
ATTR Atrybuty pliku
4 bajty
HIGH_PACK_SIZE Najbardziej znaczące 4 bajty z 64 bitowej wartości rozmiaru skompresowanego pliku
4 bajty Wartość opcjonalna, występuje tylko jeśli bit 0x100 w HEAD_FLAGS jest ustawiony.
HIGH_UNP_SIZE Najbardziej znaczące 4 bajty z 64 bitowej wartości rozmiaru nie skompresowanego pliku
4 bajty Wartość opcjonalna, występuje tylko jeśli bit 0x100 w HEAD_FLAGS jest ustawiony.
FILE_NAME Nazwa pliku – wartość wiersza rozmiaru w bajtach NAME_SIZE
SALT obecny jeśli (HEAD_FLAGS & 0x400) != 0
8 bajtów
EXT_TIME obecny jeśli (HEAD_FLAGS & 0x1000) != 0
rozmiar zmienny
inne nowe pola mogą występować tutaj.

________________________________________
Noty aplikacyjne
________________________________________

1. Aby przetworzyć archiwum SFX należy pominąć moduł wyszukiwania SFX bloku markującego w archiwum. W samym module SFX nie ma sekwencji bloku markującego (0x52 0x61 0x72 0x21 0x1a 0x07 0x00).
2. CRC jest obliczane z użyciem standardowego wielomianu 0xEDB88320. W przypadku, gdy rozmiar CRC jest mniejszy niż 4 bajty, tylko mniej znaczące bajty są używane.

Dodaj komentarz