You are on page 1of 5

RAR âåðñèÿ 3.

80 - Òåõíè÷åñêàÿ èíôîðìàöèÿ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ÎÏÈÑÛÂÀÅÌÛÉ ÔÎÐÌÀÒ ÀÐÕÈÂÀ ÄÅÉÑÒÂÈÒÅËÅÍ ÒÎËÜÊÎ ÄËß 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
ïåðåìåííûé ðàçìåð
çäåñü ìîãóò áûòü äðóãèå íîâûå ïîëÿ.

==========================================================================
Ïðèìå÷àíèÿ
==========================================================================
1. Äëÿ îáðàáîòêè SFX-àðõèâà òðåáóåòñÿ ïðîïóñòèòü ìîäóëü SFX è íàéòè
â àðõèâå áëîê-ìàðêåð. Â ñàìîì SFX-ìîäóëå ïîñëåäîâàòåëüíîñòü áàéòîâ
áëîêà-ìàðêåðà (0x52 0x61 0x72 0x21 0x1a 0x07 0x00) îòñóòñòâóåò.
2. CRC âû÷èñëÿåòñÿ ñ ïîìîùüþ ñòàíäàðòíîãî ïîëèíîìà 0xEDB88320.  ñëó÷àå
åñëè ðàçìåð CRC ìåíüøå 4 áàéò, èñïîëüçóþòñÿ òîëüêî ìëàäøèå áàéòû.

You might also like