Passa al contenuto principale

3.1.1.5. Repeat Offsets (Offset ripetuti)

Come descritto sopra, i primi tre valori definiscono gli offset ripetuti; li chiamiamo Repeated_Offset1, Repeated_Offset2 e Repeated_Offset3. Sono ordinati per recenza, con Repeated_Offset1 che rappresenta "il più recente".

Se offset_value è 1, l'offset utilizzato è Repeated_Offset1, e così via.

C'è un'eccezione: quando la literals_length della sequenza corrente è 0, gli offset ripetuti vengono spostati di 1, quindi:

  • offset_value di 1 significa Repeated_Offset2
  • offset_value di 2 significa Repeated_Offset3
  • offset_value di 3 significa Repeated_Offset1 - 1_byte

Inizializzazione

Per il primo blocco, la cronologia degli offset iniziali viene riempita con i seguenti valori:

  • Repeated_Offset1 = 1
  • Repeated_Offset2 = 4
  • Repeated_Offset3 = 8

A meno che non venga utilizzato un dizionario, nel qual caso provengono dal dizionario.

Quindi ogni blocco ottiene la sua cronologia degli offset iniziali dai valori finali del Compressed_Block più recente. Si noti che i blocchi che non sono Compressed_Blocks vengono saltati; non influenzano la cronologia degli offset.

Regole di aggiornamento

Durante l'esecuzione delle sequenze di un Compressed_Block, i valori dei Repeated_Offsets vengono mantenuti aggiornati in modo che rappresentino sempre i tre offset utilizzati più di recente. Per ottenere ciò, vengono aggiornati dopo l'esecuzione di ogni sequenza nel modo seguente:

Caso 1: Offset non ripetuto

Quando l'offset_value della sequenza non fa riferimento a uno dei Repeated_Offsets (quando ha un valore maggiore di 3, o quando ha il valore 3 e la literals_length della sequenza è zero):

  • I valori dei Repeated_Offsets vengono spostati indietro di uno
  • Repeated_Offset1 assume il valore dell'offset appena utilizzato

Formula di aggiornamento:

Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = nuovo offset

Caso 2: Offset ripetuto

Quando l'offset_value della sequenza fa riferimento a uno dei Repeated_Offsets (quando ha il valore 1 o 2, o quando ha il valore 3 e la literals_length della sequenza è diversa da zero):

  • I Repeated_Offsets vengono riordinati
  • Repeated_Offset1 assume il valore del Repeated_Offset utilizzato
  • I valori esistenti vengono respinti dal primo Repeated_Offset al Repeated_Offset selezionato da offset_value

Questo effettua efficacemente una rotazione avvolgente a un passo di questi valori di offset, in modo che il loro ordine rifletta nuovamente la loro recenza di utilizzo.

Tabella di esempio di aggiornamento

La seguente tabella mostra i valori quando si applica una serie di sequenze ai Repeated_Offsets:

offset_valueliterals_lengthRepeated_Offset1Repeated_Offset2Repeated_Offset3Comment (Commento)
--148Valore iniziale
111411111114Non-ripetizione
122111114Ripetizione1; nessun cambiamento
222522222211111Non-ripetizione
1114111111122221111Non-ripetizione
333633333311112222Non-ripetizione
222111133332222Ripetizione2; scambio 1 e 2
333222211113333Ripetizione3; rotazione 3 a 1
10222122221111Offset analizzato inserito
10222222213333Ripetizione2

Tabella 18: Repeated_Offsets

Gestione dei casi speciali

Caso literals_length = 0

Quando literals_length = 0, l'interpretazione di offset_value si sposta:

offset_valueOffset effettivamente utilizzato
1Repeated_Offset2
2Repeated_Offset3
3Repeated_Offset1 - 1

Questo trattamento speciale è destinato a ottimizzare le operazioni di copia di corrispondenza consecutive.


Punti chiave

  1. Principio di recenza: Repeated_Offset1 è sempre l'offset utilizzato più di recente
  2. Aggiornamento automatico: La cronologia degli offset viene aggiornata automaticamente dopo ogni esecuzione di sequenza
  3. Supporto dizionario: I valori iniziali possono provenire dal dizionario
  4. Spostamento speciale: L'interpretazione dell'offset cambia quando literals_length=0