5. Codifica delle lunghezze di inserimento letterale e delle lunghezze di copia (Encoding of Literal Insertion Lengths and Copy Lengths)
5. Codifica delle lunghezze di inserimento letterale e delle lunghezze di copia (Encoding of Literal Insertion Lengths and Copy Lengths)
Come descritto nella sezione 2, le lunghezze di inserimento letterale (Literal Insertion Lengths) e le lunghezze di copia all'indietro (Backward Copy Lengths) sono codificate utilizzando un singolo codice prefisso. Questa sezione fornisce i dettagli di questa codifica.
Ogni coppia <insertion length, copy length> nella parte dati compressi di un meta-blocco è rappresentata dal seguente tripletto:
<insert-and-copy length code, insert extra bits, copy extra bits>
Il codice di lunghezza di inserimento e copia (Insert-and-Copy Length Code), i bit extra di inserimento (Insert Extra Bits) e i bit extra di copia (Copy Extra Bits) sono codificati uno dopo l'altro, il codice di lunghezza di inserimento e copia è codificato utilizzando un codice prefisso sull'alfabeto dei codici di lunghezza di inserimento e copia, mentre i valori dei bit extra sono codificati come valori interi a larghezza fissa. Il numero di bit extra di inserimento e copia può essere 0..24, e dipendono dal codice di lunghezza di inserimento e copia.
Alcuni dei codici di lunghezza di inserimento e copia esprimono anche il fatto che il simbolo di distanza della distanza nello stesso comando è 0, cioè il componente di distanza del comando è lo stesso di quello del comando precedente. In questo caso, il codice di distanza e i bit extra per la distanza sono omessi dal flusso di dati compressi.
Descriviamo l'alfabeto dei codici di lunghezza di inserimento e copia in termini degli alfabeti (non direttamente utilizzati) di codice di lunghezza di inserimento (Insert Length Code) e codice di lunghezza di copia (Copy Length Code). I simboli dell'alfabeto del codice di lunghezza di inserimento, insieme al numero di bit extra di inserimento e all'intervallo delle lunghezze di inserimento sono i seguenti:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 0 8 2 10..13 16 6 130..193
1 0 1 9 2 14..17 17 7 194..321
2 0 2 10 3 18..25 18 8 322..577
3 0 3 11 3 26..33 19 9 578..1089
4 0 4 12 4 34..49 20 10 1090..2113
5 0 5 13 4 50..65 21 12 2114..6209
6 1 6,7 14 5 66..97 22 14 6210..22593
7 1 8,9 15 5 98..129 23 24 22594..16799809
I simboli dell'alfabeto del codice di lunghezza di copia, insieme al numero di bit extra di copia e all'intervallo delle lunghezze di copia sono i seguenti:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 2 8 1 10,11 16 5 70..101
1 0 3 9 1 12,13 17 5 102..133
2 0 4 10 2 14..17 18 6 134..197
3 0 5 11 2 18..21 19 7 198..325
4 0 6 12 3 22..29 20 8 326..581
5 0 7 13 3 30..37 21 9 582..1093
6 0 8 14 4 38..53 22 10 1094..2117
7 0 9 15 4 54..69 23 24 2118..16779333
Per convertire un codice di lunghezza di inserimento e copia in un codice di lunghezza di inserimento e un codice di lunghezza di copia, può essere utilizzata la seguente tabella:
Insert
length Copy length code
code 0..7 8..15 16..23
+----------+----------+
| | |
0..7 | 0..63 | 64..127 | <--- distance symbol 0
| | |
+----------+----------+----------+
| | | |
0..7 | 128..191 | 192..255 | 384..447 |
| | | |
+----------+----------+----------+
| | | |
8..15 | 256..319 | 320..383 | 512..575 |
| | | |
+----------+----------+----------+
| | | |
16..23 | 448..511 | 576..639 | 640..703 |
| | | |
+----------+----------+----------+
Innanzitutto, cercare la cella con l'intervallo di 64 valori contenente il codice di lunghezza di inserimento e copia; questo fornisce gli intervalli di codice di lunghezza di inserimento e codice di lunghezza di copia, entrambi lunghi 8 valori. Il codice di lunghezza di copia all'interno del suo intervallo è determinato dai bit 0..2 (contati dal lsb) del codice di lunghezza di inserimento e copia. Il codice di lunghezza di inserimento all'interno del suo intervallo è determinato dai bit 3..5 (contati dal lsb) del codice di lunghezza di inserimento e copia. Dati i codici di lunghezza di inserimento e lunghezza di copia, le lunghezze di inserimento e copia effettive possono essere ottenute leggendo il numero di bit extra fornito dalle tabelle sopra.
Se il codice di lunghezza di inserimento e copia è tra 0 e 127, il codice di distanza del comando è impostato a zero (l'ultima distanza riutilizzata).
Fonte (Source): RFC 7932, Section 5
Testo ufficiale (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt