
               RAR versione 3.93 - 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.
