Passa al contenuto principale

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_BlockBlock_TypeBlock_Size
bit 0bits 1-2bits 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)
0Raw_Block (Blocco grezzo)
1RLE_Block (Blocco RLE)
2Compressed_Block (Blocco compresso)
3Reserved (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).