RAR versione 4.x - Informazioni tecniche

Il formato d'archivio di seguito descritto è valido solo per le versione 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 2 bytes Sempre 0x6152
HEAD_TYPE 1 byte Tipo di blocco: 0x72
HEAD_FLAGS 2 bytes Sempre 0x1a21
HEAD_SIZE 2 bytes Dimensione blocco = 0x0007

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 2 bytes dei campi da HEAD_TYPE a RESERVED2
HEAD_TYPE 1 byte Tipo di blocco: 0x73
HEAD_FLAGS 2 bytes Bit indicatori:
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 2 bytes Dimensione totale dell'intestazione dell'archivio, compreso l'eventuale commento
RESERVED1 2 bytes Riservato
RESERVED2 4 bytes Riservato

Intestazione del file (File nell'archivio)

HEAD_CRC 2 bytes CRC dei campi da HEAD_TYPE a FILEATTR e del nome del file
HEAD_TYPE 1 byte Tipo blocco: 0x74
HEAD_FLAGS 2 bytes Bit indicatori:
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 ommento 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 2 bytes Dimensione totale dell'intestazione, compreso il nome del file e l'eventuale commento.
PACK_SIZE 4 bytes Dimensione del file compresso.
UNP_SIZE 4 bytes

Dimensione del file non compresso.

HOST_OS 1 byte Sistema operativo utilizzato per l'archiviazione:
0 - MS DOS
1 - OS/2
2 - Windows
3 - Unix
4 - Mac OS
5 - BeOS
FILE_CRC 4 bytes CRC del file.
FTIME 4 bytes Data ed orario nel formato standard MS DOS.
UNP_VER 1 byte Versione di RAR necessaria per estrarre il file.
Il numero della versione è memorizzato nel formato 10 * cifra_versione_maggiore + cifra_versione_minore.
METHOD 1 byte Metodo di compressione.
0x30 - memorizzazione
0x31 - compressione più veloce
0x32 - compressione veloce
0x33 - compressione normale
0x34 - compressione buona
0x35 - compressione migliore
NAME_SIZE 2 bytes Dimensione del nome del file.
ATTR 4 bytes Attributi del file.
HIGH_PACK_SIZE 4 bytes I 4 bytes alti del valore a 64 bit riferito alla dimesione del file compresso. Valore opzionale, presente solo se è attivo il bit 0x100 di HEAD_FLAGS.
HIGH_UNP_SIZE 4 bytes I 4 bytes alti del valore a 64 bit riferito alla dimensione del file non compresso. Valore opzionale, presente solo se è attivo il bit 0x100 di HEAD_FLAGS.
FILE_NAME NAME_SIZE Nome del file.
SALT 8 bytes presente se (HEAD_FLAGS & 0x400) != 0
EXT_TIME dimensione variabile presente se (HEAD_FLAGS & 0x1000) != 0

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.