Passa al contenuto principale

6. Codifica dei comandi di cambio blocco (Encoding of Block-Switch Commands)

6. Codifica dei comandi di cambio blocco (Encoding of Block-Switch Commands)

Come descritto nella sezione 2, un comando di cambio blocco (Block-Switch Command) è una coppia <block type, block count>. Questi sono codificati nella parte dati compressi del meta-blocco, subito prima dell'inizio di ogni nuovo blocco di una particolare categoria di blocco.

Ogni tipo di blocco (Block Type) nei dati compressi è rappresentato da un codice di tipo di blocco (Block Type Code), codificato utilizzando un codice prefisso sull'alfabeto dei codici di tipo di blocco. Un simbolo di tipo di blocco 0 significa che il nuovo tipo di blocco è lo stesso del tipo del blocco precedente della stessa categoria di blocco, cioè il tipo di blocco che precedeva il tipo attuale, mentre un simbolo di tipo di blocco 1 significa che il nuovo tipo di blocco è uguale al tipo di blocco attuale più uno. Se il tipo di blocco attuale è il massimo possibile, allora un simbolo di tipo di blocco di 1 comporta un ritorno a un nuovo tipo di blocco di 0. I simboli di tipo di blocco 2..257 rappresentano rispettivamente i tipi di blocco 0..255. I tipi di blocco precedente e attuale sono inizializzati rispettivamente a 1 e 0, alla fine dell'header del meta-blocco.

Poiché il primo tipo di blocco di ogni categoria di blocco è 0, il tipo di blocco del primo comando di cambio blocco non è codificato nei dati compressi. Se una categoria di blocco ha un solo tipo di blocco, anche il conteggio blocchi (Block Count) del primo comando di cambio blocco è omesso dai dati compressi; altrimenti, è codificato nell'header del meta-blocco.

Poiché la fine del meta-blocco è rilevata dal numero di byte non compressi prodotti, i conteggi blocchi per qualsiasi delle tre categorie non devono contare esattamente fino a zero alla fine del meta-blocco.

Il numero di tipi di blocchi diversi in ciascuna categoria di blocco, indicato da NBLTYPESL, NBLTYPESI e NBLTYPESD per letterali, lunghezze di inserimento e copia, e distanze, rispettivamente, è codificato nell'header del meta-blocco, e deve essere uguale al tipo di blocco più grande più uno in quella categoria di blocco. In altre parole, l'insieme dei tipi di blocchi letterali, di lunghezze di inserimento e copia, e di distanze deve essere rispettivamente [0..NBLTYPESL-1], [0..NBLTYPESI-1] e [0..NBLTYPESD-1]. Ne consegue che la dimensione dell'alfabeto dei codici di tipo di blocco letterali, di lunghezze di inserimento e copia, e di distanze è rispettivamente NBLTYPESL + 2, NBLTYPESI + 2 e NBLTYPESD + 2.

Ogni conteggio blocchi nei dati compressi è rappresentato da una coppia <block count code, extra bits>. Il codice di conteggio blocchi (Block Count Code) e i bit extra (Extra Bits) sono codificati uno dopo l'altro, il codice di conteggio blocchi è codificato utilizzando un codice prefisso sull'alfabeto dei codici di conteggio blocchi, mentre il valore dei bit extra è codificato come valore intero a larghezza fissa. Il numero di bit extra può essere 0..24, e dipende dal codice di conteggio blocchi.

I simboli dell'alfabeto dei codici di conteggio blocchi insieme al numero di bit extra e all'intervallo dei conteggi blocchi sono i seguenti:

        Extra              Extra               Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 2 1..4 9 4 65..80 18 7 369..496
1 2 5..8 10 4 81..96 19 8 497..752
2 2 9..12 11 4 97..112 20 9 753..1264
3 2 13..16 12 5 113..144 21 10 1265..2288
4 3 17..24 13 5 145..176 22 11 2289..4336
5 3 25..32 14 5 177..208 23 12 4337..8432
6 3 33..40 15 5 209..240 24 13 8433..16624
7 3 41..48 16 6 241..304 25 24 16625..16793840
8 4 49..64 17 6 305..368

Il primo comando di cambio blocco di ogni categoria di blocco è speciale nel senso che è codificato nell'header del meta-blocco, e come descritto in precedenza, il codice di tipo di blocco è omesso perché è implicitamente zero.


Fonte (Source): RFC 7932, Section 6
Testo ufficiale (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt