3.1.1.2. Blocks (Blocchi)
Dopo Magic_Number e Frame_Header, ci sono diversi blocchi. Ogni frame deve avere almeno 1 blocco, ma non c'è un limite superiore al numero di blocchi per frame.
La struttura di un blocco è la seguente:
+==============+===============+
|| Block_Header | Block_Content |
+==============+===============+
|| 3 bytes | n bytes |
+--------------+---------------+
Tabella 8: Struttura di un blocco
Block_Header utilizza 3 byte, scritti utilizzando la convenzione little-endian. Contiene tre campi:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
Tabella 9: Block_Header
3.1.1.2.1. Last_Block (Ultimo blocco)
Il bit meno significativo (Last_Block) indica se questo è l'ultimo blocco. Il frame terminerà dopo questo ultimo blocco. Può essere seguito da una Content_Checksum opzionale (vedere sezione 3.1.1).
3.1.1.2.2. Block_Type (Tipo di blocco)
I successivi 2 bit rappresentano il Block_Type. Ci sono quattro tipi di blocchi:
| Value (Valore) | Block_Type (Tipo di blocco) |
|---|---|
| 0 | Raw_Block (Blocco grezzo) |
| 1 | RLE_Block (Blocco RLE) |
| 2 | Compressed_Block (Blocco compresso) |
| 3 | Reserved (Riservato) |
Tabella 10: Quattro tipi di blocchi
Raw_Block (Blocco grezzo) : Si tratta di un blocco non compresso. Block_Content contiene Block_Size byte.
RLE_Block (Blocco RLE) : Si tratta di un singolo byte, ripetuto Block_Size volte. Block_Content è composto da un singolo byte. Sul lato della decompressione, questo byte deve essere ripetuto Block_Size volte.
Compressed_Block (Blocco compresso) : Si tratta del blocco compresso descritto nella sezione 3.1.1.3. Block_Size è la lunghezza di Block_Content, ovvero i dati compressi. La dimensione decompressa è sconosciuta, ma il suo valore massimo possibile è garantito (vedere di seguito).
Reserved (Riservato) : Questo non è un blocco. Questo valore non può essere utilizzato con la specifica attuale. Se tale valore è presente, viene considerato come dati corrotti, e un decodificatore conforme alla specifica deve rifiutarlo.
3.1.1.2.3. Block_Size (Dimensione blocco)
I 21 bit superiori del Block_Header rappresentano la Block_Size.
Quando Block_Type è Compressed_Block o Raw_Block, Block_Size è la dimensione di Block_Content (quindi non include il Block_Header).
Quando Block_Type è RLE_Block, poiché la dimensione di Block_Content è sempre 1, Block_Size rappresenta il numero di volte che questo byte deve essere ripetuto.
Block_Size è limitato da Block_Maximum_Size (vedere di seguito).
3.1.1.2.4. Block_Content and Block_Maximum_Size (Contenuto blocco e dimensione massima blocco)
La dimensione di Block_Content è limitata da Block_Maximum_Size, che è il minore dei due seguenti:
- Window_Size
- 128 KB
Block_Maximum_Size è costante per un dato frame. Questo massimo si applica sia alla dimensione decompressa che alla dimensione compressa di qualsiasi blocco nel frame.
La motivazione per questa limitazione è che il decodificatore può leggere queste informazioni all'inizio del frame e utilizzarle per allocare buffer. La garanzia della dimensione del blocco assicura che il buffer sia sufficiente per tutti i blocchi successivi di un frame valido.
Se un blocco compresso è più grande di un blocco non compresso, si raccomanda di inviare invece un blocco non compresso (ovvero Raw_Block).