RAR versione 3.70 - Informazioni tecniche
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IL FORMATO D'ARCHIVIO DI SEGUITO DESCRITTO E' VALIDO SOLO PER LE VERSIONI
DALLA 1.50 IN POI.
===========================================================================
Formato di un archivio RAR
===========================================================================
Il file di un archivio consiste in una serie di blocchi a lunghezza
variabile. L'ordine di questi blocchi può variare, ma il primo deve essere
un blocco di marcaggio, seguito da un blocco d'intestazione archivio.
Ogni blocco inizia con i seguenti campi:
HEAD_CRC 2 bytes CRC del blocco intero o parziale
HEAD_TYPE 1 byte Tipo di blocco
HEAD_FLAGS 2 bytes Blocco con indicatori
HEAD_SIZE 2 bytes Dimensione del blocco
ADD_SIZE 4 bytes Campo opzionale - dimensione del blocco
aggiunto
Il campo ADD_SIZE è presente solo se (HEAD_FLAGS & 0x8000) != 0
La dimensione del blocco è HEAD_SIZE se (HEAD_FLAGS & 0x8000) == 0 o
HEAD_SIZE+ADD_SIZE se il campo ADD_SIZE è presente, quando appunto
(HEAD_FLAGS & 0x8000) != 0.
In ogni blocco i seguenti bit nel campo HEAD_FLAGS hanno lo stesso
significato:
0x4000 - se impostato, le vecchie versioni di RAR ignoreranno questo
blocco e lo rimuoveranno nel caso di un aggiornamento
dell'archivio; se ha un valore di zero, il blocco viene copiato
nel nuovo archivio nel caso di un aggiornamento dell'archivio;
0x8000 - se impostato indica che il campo ADD_SIZE è presente e la
dimensione totale del blocco corrisponde a HEAD_SIZE+ADD_SIZE.
Tipi di blocchi definiti:
HEAD_TYPE=0x72 blocco di marcaggio
HEAD_TYPE=0x73 intestazione dell'archivio
HEAD_TYPE=0x74 intestazione del file
HEAD_TYPE=0x75 intestazione del commento nel vecchio formato
HEAD_TYPE=0x76 informazioni d'autenticità nel vecchio formato
HEAD_TYPE=0x77 sotto-blocco nel vecchio formato
HEAD_TYPE=0x78 dati per il recupero nel vecchio formato
HEAD_TYPE=0x79 informazioni d'autenticità nel vecchio formato
HEAD_TYPE=0x7a sotto-blocco
Il blocco di commento è utilizzato attualmente solo all'interno di
altri blocchi e non può esistere separato.
Il processo di gestione dell'archivio avviene come segue:
1. Lettura e controllo blocco di marcaggio
2. Lettura intestazione dell'archivio
3. Lettura o salto di HEAD_SIZE-dimensione_di(MAIN_HEAD) bytes
4. Se viene individuata la fine dell'archivio allora viene terminato il
processo di gestione, alrimenti vengono letti i 7 bytes dei campi
HEAD_CRC, HEAD_TYPE, HEAD_FLAGS, HEAD_SIZE seguenti.
5. Verifica di HEAD_TYPE:
se HEAD_TYPE==0x74
lettura dell'intestazione (i primi 7 bytes, già letti)
lettura o salto di HEAD_SIZE-dimensionedi(FILE_HEAD) bytes
se (HEAD_FLAGS & 0x100)
lettura o salto di HIGH_PACK_SIZE*0x100000000+PACK_SIZE bytes
altrimenti
lettura o salto di PACK_SIZE bytes
altrimenti
lettura del corrispondente blocco HEAD_TYPE:
lettura di HEAD_SIZE-7 bytes
se (HEAD_FLAGS & 0x8000)
lettura di ADD_SIZE bytes
6. vai al punto 4.
==========================================================================
Formati dei Blocchi
==========================================================================
Blocco di marcaggio ( MARK_HEAD )
---------------------------------
HEAD_CRC Sempre 0x6152
2 bytes
HEAD_TYPE Tipo di blocco: 0x72
1 byte
HEAD_FLAGS Sempre 0x1a21
2 bytes
HEAD_SIZE Dimensione blocco = 0x0007
2 bytes
Attualmente il blocco di marcaggio viene considerato come una sequenza
ben definita di bytes: 0x52 0x61 0x72 0x21 0x1a 0x07 0x00.
Intestazione dell'archivio ( MAIN_HEAD )
----------------------------------------
HEAD_CRC CRC dei campi da HEAD_TYPE a RESERVED2
2 bytes
HEAD_TYPE Tipo di blocco: 0x73
1 byte
HEAD_FLAGS Bit indicatori:
2 bytes
0x0001 - Attributo di volume (archivio multi-volume)
0x0002 - E' presente un commento dell'archivio.
RAR 3.x usa un blocco separato per il commento e
non imposta questo indicatore.
0x0004 - Attributo per archivio bloccato
0x0008 - Attributo di archiviazione solida
0x0010 - Nuovo schema d'assegnazione dei nomi ai volumi
('nome_volume.partN.rar')
0x0020 - Sono presenti le informazioni d'autenticità
RAR 3.x non imposta questo indicatore.
0x0040 - E' presente l'informazione per il recupero dei
dati
0x0080 - L'intestazione del blocco è crittografata
0x0100 - Primo volume (impostato solo da RAR 3.00 e
seguenti)
gli altri bit in HEAD_FLAGS sono riservati per uso
interno.
HEAD_SIZE Dimensione totale dell'intestazione dell'archivio,
2 bytes compreso l'eventuale commento
RESERVED1 Riservato
2 bytes
RESERVED2 Riservato
4 bytes
Intestazione del file (File nell'archivio)
------------------------------------------
HEAD_CRC CRC dei campi da HEAD_TYPE a FILEATTR
2 bytes e del nome del file
HEAD_TYPE Tipo blocco: 0x74
1 byte
HEAD_FLAGS Bit indicatori:
2 bytes
0x01 - continuazione da un volume precedente
0x02 - continua nel volume seguente
0x04 - file crittografato con parola chiave
0x08 - è presente il commento del file
RAR 3.x usa un blocco separato per il commento e
non imposta questo indicatore.
0x10 - vengono utilizzate le informazioni del file
precedente (indicazione per l'archivio solido)
(per RAR 2.0 o seguenti)
bits 7 6 5 (per RAR 2.0 e seguenti)
0 0 0 - dimensione dizionario 64 KB
0 0 1 - dimensione dizionario 128 KB
0 1 0 - dimensione dizionario 256 KB
0 1 1 - dimensione dizionario 512 KB
1 0 0 - dimensione dizionario 1024 KB
1 0 1 - dimensione dizionario 2048 KB
1 1 0 - dimensione dizionario 4096 KB
1 1 1 - file è una cartella
0x100 - I campi HIGH_PACK_SIZE e HIGH_UNP_SIZE sono
presenti. Questi campi sono utilizzati solo per
archiviare file veramente grandi (oltre i 2Gbytes);
per file più piccoli questi campi sono assenti.
0x200 - Il campo FILE_NAME contiene sia il nome del file
nel formato usuale sia quello con codifica Unicode,
seprati da uno 0. In questo caso il valore del
campo NAME_SIXZE sarà uguale alla somma della
lunghezza del nome usuale più la lunghezza del nome
codificato in Unicode, più 1.
Se questo indicatore è presente ma il campo
FILE_NAME non contiene il byte con valore 0
significa che il nome del file è codificato solo
con il formato UTF-8,
0x400 - L'intestazione contiene 8 bytes aggiuntivi dopo il
nome del file, utilizzati per incrementare il
livello di sicurezza della crittografia
(chiamato anche 'salt').
0x800 - Indicatore di versione. E' un vecchio indicatore
della versione del file. Ora il progressivo della
versione del file viene appeso al nome come ';n'.
0x1000 - Indica che è presente il campo con i dati estesi
sugli orari.
0x8000 - Questo bit solitamente è attivo, così la dimensione
completa del blocco è data da HEAD_SIZE + PACK_SIZE
(e più HIGH_PACK_SIZE, se è attivo il bit 0x100)
HEAD_SIZE Dimensione totale dell'intestazione, compreso il nome del
2 bytes file e l'eventuale commento.
PACK_SIZE Dimensione del file compresso.
4 bytes
UNP_SIZE Dimensione del file non compresso.
4 bytes
HOST_OS Sistema operativo utilizzato per l'archiviazione:
1 byte 0 - MS DOS
1 - OS/2
2 - Win32
3 - Unix
4 - Mac OS
5 - BeOS
FILE_CRC CRC del file.
4 bytes
FTIME Data ed orario nel formato standard MS DOS.
4 bytes
UNP_VER Versione di RAR necessaria per estrarre il file.
1 byte
Il numero della versione è memorizzato nel formato
10 * cifra_versione_maggiore + cifra_versione_minore.
METHOD Metodo di compressione.
1 byte
0x30 - memorizzazione
0x31 - compressione più veloce
0x32 - compressione veloce
0x33 - compressione normale
0x34 - compressione buona
0x35 - compressione migliore
NAME_SIZE Dimensione del nome del file.
2 bytes
ATTR Attributi del file.
4 bytes
HIGH_PACK_SIZE I 4 bytes alti del valore a 64 bit riferito alla
4 bytes dimesione del file compresso. Valore opzionale, presente
solo se è attivo il bit 0x100 di HEAD_FLAGS.
HIGH_UNP_SIZE I 4 bytes alti del valore a 64 bit riferito alla
4 bytes dimensione del file non compresso. Valore opzionale,
presente solo se è attivo il bit 0x100 di HEAD_FLAGS.
FILE_NAME Nome del file: una stringa lunga NAME_SIZE bytes.
SALT presente se (HEAD_FLAGS & 0x400) != 0
8 bytes
EXT_TIME presente se (HEAD_FLAGS & 0x1000) != 0
dimensione
variabile
altri nuovi campo potranno apparire qui.
==========================================================================
Note applicative
==========================================================================
1. Per gestire correttamene un archivio auto-estraente dovere saltare
il modulo auto-estraente cercando il blocco di marcaggio. Non ci
sono altri blocchi di marcaggio (0x52 0x61 0x72 0x21 0x1a 0x07 0x00)
nel modulo auto-estraente.
2. Il CRC viene calcolato utilizzando il polinomio standard 0xEDB88320.
Nei casi in cui il valore del CRC è inferiore ai 4 bytes, verranno
utilizzati soli i bytes d'ordine inferiore.
|