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 & 0×8000) != 0
Całkowity rozmiar bloku to HEAD_SIZE jeżeli (HEAD_FLAGS & 0×8000) == 0
i HEAD_SIZE+ADD_SIZE jeżeli pole ADD_SIZE występuje – kiedy
(HEAD_FLAGS & 0×8000) != 0.
W każdym bloku poniższe bity w HEAD_FLAGS mają te same znaczenia:
0×4000 – 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;
0×8000 – 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=0×72 blok markujący
HEAD_TYPE=0×73 nagłówek archiwum
HEAD_TYPE=0×74 nagłówek pliku
HEAD_TYPE=0×75 nagłówek komentarza starego typu
HEAD_TYPE=0×76 informacja o autentyczności starego typu
HEAD_TYPE=0×77 pod-blok starego typu
HEAD_TYPE=0×78 rekord odzyskiwania starego typu
HEAD_TYPE=0×79 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==0×74
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 & 0×100)
odczyt lub pominięcie HIGH_PACK_SIZE*0×100000000+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 & 0×8000)
odczyt ADD_SIZE bajtów
6. idź do 4.
________________________________________
Formaty bloków________________________________________
Blok markujący ( MARK_HEAD )
HEAD_CRC Zawsze 0×6152
2 bajty
HEAD_TYPE Typ nagłówka: 0×72
1 bajt
HEAD_FLAGS Zawsze 0x1a21
2 bajty
HEAD_SIZE Rozmiar bloku = 0×0007
2 bajty
Aktualnie blok markujący jest przemyślany jako ustalona sekwencja bajtów: 0×52 0×61 0×72 0×21 0x1a 0×07 0×00
Nagłówek archiwum ( MAIN_HEAD )
HEAD_CRC CRC pól HEAD_TYPE do RESERVED2
2 bajty
HEAD_TYPE Typ nagłówka: 0×73
1 bajt
HEAD_FLAGS Flagi bitowe:
2 bajty
0×0001 – atrybut objętości (objętość archiwum)
0×0002 – komentarz archiwum jest obecny
RAR 3.x używa oddzielnych bloków komentarzy i nie ustawia tej flagi
0×0004 – atrybut blokady archiwum
0×0008 – atrybut ciągłości (archiwum ciągłe)
0×0010 – nowy schemat nazewnictwa wolumenów (\’nazwa.czesc.N.rar\’)
0×0020 – informacja o autentyczności jest obecna
RAR 3.x nie ustawia tej flagi
0×0040 – rekord odzyskiwania jest obecny
0×0080 – nagłówki bloków są zaszyfrowane
0×0100 – 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: 0×74
1 bajt
HEAD_FLAGS Flagi bitowe:
2 bajty
0×01 – plik jest kontynuowany z poprzedniego wolumenu
0×02 – plik kontynuowany w następnym wolumenie
0×04 – plik zaszyfrowany z hasłem
0×08 – komentarz pliku jest obecny
RAR 3.x używa osobnego bloku komentarza i nie ustawia tej flagi.
0×10 – 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
0×100 – 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.
0×200 – 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.
0×400 – nagłówek zawiera dodatkowe 8 bajtów po nazwie pliku, które są wymagane dla zwiększenia bezpieczeństwa szyfrowania (nazywane jest to ‘salt’).
0×800 – Flaga wersji. To jest stara wersja pliku, numer wersji jest dołączony do nazwy pliku jako ‘;n’.
0×1000 – Rozszerzone pole czasu jest obecne.
0×8000 – ten bit jest zawsze ustawiony, więc rozmiar bloku jest równy HEAD_SIZE + PACK_SIZE (plus HIGH_PACK_SIZE jeśli bit 0×100 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
0×30 – bez kompresji
0×31 – najszybsza kompresja
0×32 – szybka kompresja
0×33 – normalna kompresja
0×34 – dobra kompresja
0×35 – 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 0×100 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 0×100 w HEAD_FLAGS jest ustawiony.
FILE_NAME Nazwa pliku – wartość wiersza rozmiaru w bajtach NAME_SIZE
SALT obecny jeśli (HEAD_FLAGS & 0×400) != 0
8 bajtów
EXT_TIME obecny jeśli (HEAD_FLAGS & 0×1000) != 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 (0×52 0×61 0×72 0×21 0x1a 0×07 0×00).
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.
Podobne tematy:
- Jaka jest sygnatura archiwum RAR?
- Jaka jest maksymalna liczba plików, które można dodać do archiwum?
- Jaka jest różnica między szyfrowaniem ZIP i RAR?
- Jaka jest różnica między wierszem poleceń WinRAR i RAR?
- Jaki jest maksymalny dopuszczalny rozmiar pliku oraz archiwum?
- Czy jest dostępna jakaś biblioteka API lub biblioteka kompresji dla programu RAR?
- Dlaczego WinRAR nie używa słownika 4096 KB w moim archiwum?
- Jaka jest maksymalna długość hasła?
- Pojawia się komunikat o błędzie “Błąd CRC w nazwie woluminu spakowanych danych. Wolumin jest uszkodzony”.
- Jakich algorytmów kompresji danych używa RAR?
