3.1.1.1. Frame Header (Intestazione frame)
La dimensione dell'intestazione del frame è variabile, minimo 2 byte e massimo 14 byte, a seconda dei parametri facoltativi. La struttura di Frame_Header è la seguente:
+-------------------------+-----------+
|| Frame_Header_Descriptor | 1 byte |
+-------------------------+-----------+
|| [Window_Descriptor] | 0-1 byte |
+-------------------------+-----------+
|| [Dictionary_ID] | 0-4 bytes |
+-------------------------+-----------+
|| [Frame_Content_Size] | 0-8 bytes |
+-------------------------+-----------+
Tabella 2: Struttura di Frame_Header
3.1.1.1.1. Frame_Header_Descriptor (Descrittore intestazione frame)
Il primo byte dell'intestazione è chiamato Frame_Header_Descriptor. Descrive quali altri campi sono presenti. La decodifica di questo byte è sufficiente per determinare la dimensione di Frame_Header.
| Numero di bit (Bit Number) | Nome del campo (Field Name) |
|---|---|
| 7-6 | Frame_Content_Size_Flag |
| 5 | Single_Segment_Flag |
| 4 | (inutilizzato, unused) |
| 3 | (riservato, reserved) |
| 2 | Content_Checksum_Flag |
| 1-0 | Dictionary_ID_Flag |
Tabella 3: Frame_Header_Descriptor
Nella tabella 3, il bit 7 è il bit più significativo e il bit 0 è il bit meno significativo.
3.1.1.1.1.1. Frame_Content_Size_Flag (Flag dimensione contenuto frame)
Si tratta di un flag a 2 bit (equivalente a Frame_Header_Descriptor spostato di 6 bit a destra), che specifica se Frame_Content_Size (dimensione dati decompressi) è fornito nell'intestazione. Frame_Content_Size_Flag fornisce FCS_Field_Size, il numero di byte utilizzati da Frame_Content_Size secondo la tabella 4:
| Frame_Content_Size_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| FCS_Field_Size | 0 o 1 | 2 | 4 | 8 |
Tabella 4: Frame_Content_Size_Flag fornisce FCS_Field_Size
Quando Frame_Content_Size_Flag è 0, FCS_Field_Size dipende da Single_Segment_Flag: se Single_Segment_Flag è impostato, allora FCS_Field_Size è 1. Altrimenti, FCS_Field_Size è 0; Frame_Content_Size non è fornito.
3.1.1.1.1.2. Single_Segment_Flag (Flag segmento singolo)
Se questo flag è impostato, i dati devono essere rigenerati in un singolo segmento di memoria contiguo.
In questo caso, il byte Window_Descriptor viene saltato, ma Frame_Content_Size deve essere presente. Pertanto, il decodificatore deve allocare un segmento di memoria di dimensione uguale o superiore a Frame_Content_Size.
Per proteggere il decodificatore da richieste di memoria irragionevoli, è consentito al decodificatore rifiutare frame compressi che richiedono dimensioni di memoria superiori all'intervallo autorizzato del decodificatore.
Per una compatibilità più ampia, si raccomanda che i decodificatori supportino almeno una dimensione di memoria di 8 MB. Questa è solo una raccomandazione; ogni decodificatore può liberamente supportare limiti superiori o inferiori in base ai vincoli locali.
3.1.1.1.1.3. Unused Bit (Bit inutilizzato)
Un decodificatore conforme a questa versione della specifica non deve interpretare questo bit. Può essere utilizzato nelle versioni future per rappresentare attributi che non sono essenziali per decodificare correttamente il frame. Un codificatore conforme a questa specifica deve impostare questo bit a zero.
3.1.1.1.1.4. Reserved Bit (Bit riservato)
Questo bit è riservato per future funzionalità. Il suo valore deve essere zero. Un decodificatore conforme a questa versione della specifica deve assicurarsi che non sia impostato. Questo bit può essere utilizzato nelle revisioni future per rappresentare funzionalità che devono essere interpretate per decodificare correttamente il frame.
3.1.1.1.1.5. Content_Checksum_Flag (Flag checksum contenuto)
Se questo flag è impostato, una Content_Checksum a 32 bit sarà presente alla fine del frame. Vedere la descrizione di Content_Checksum sopra.
3.1.1.1.1.6. Dictionary_ID_Flag (Flag ID dizionario)
Si tratta di un flag a 2 bit (= Frame_Header_Descriptor & 0x3), che indica se un ID dizionario è fornito nell'intestazione. Specifica anche la dimensione di questo campo come DID_Field_Size:
| Dictionary_ID_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| DID_Field_Size | 0 | 1 | 2 | 4 |
Tabella 5: Dictionary_ID_Flag
3.1.1.1.2. Window Descriptor (Descrittore finestra)
Questo fornisce una garanzia sul buffer di memoria minimo richiesto per decomprimere il frame. Questa informazione è importante affinché il decodificatore allochi memoria sufficiente.
Il byte Window_Descriptor è facoltativo. Quando Single_Segment_Flag è impostato, Window_Descriptor non è presente. In questo caso, Window_Size è uguale a Frame_Content_Size, e il suo valore può variare da 0 a 2^64 - 1 byte (16 ExaByte).
| Numero di bit (Bit Number) | 7-3 | 2-0 |
|---|---|---|
| Nome del campo (Field Name) | Exponent (Esponente) | Mantissa |
Tabella 6: Window_Descriptor
La dimensione minima del buffer di memoria è chiamata Window_Size. È descritta dalla seguente formula:
windowLog = 10 + Exponent;
windowBase = 1 << windowLog;
windowAdd = (windowBase / 8) * Mantissa;
Window_Size = windowBase + windowAdd;
La Window_Size minima è 1 KB. La Window_Size massima è (1<<41) + 7*(1<<38) byte, ovvero 3,75 TB.
In generale, valori di Window_Size più grandi tendono a migliorare il rapporto di compressione, a scapito di un maggiore utilizzo della memoria.
Per decodificare correttamente i dati compressi, il decodificatore deve allocare un buffer di almeno Window_Size byte.
Per proteggere il decodificatore da richieste di memoria irragionevoli, è consentito al decodificatore rifiutare frame compressi che richiedono dimensioni di memoria superiori all'intervallo autorizzato del decodificatore.
Per migliorare l'interoperabilità, si raccomanda che i decodificatori supportino valori di Window_Size fino a 8 MB e che i codificatori non generino frame che richiedono una Window_Size superiore a 8 MB. Questa è solo una raccomandazione, e i decodificatori possono liberamente supportare limiti superiori o inferiori in base ai vincoli locali.
3.1.1.1.3. Dictionary_ID (ID dizionario)
Questo è un campo di dimensione variabile che contiene l'ID dizionario richiesto per decodificare correttamente il frame. Questo campo è facoltativo. Se non è presente, spetta al decodificatore decidere quale dizionario utilizzare.
La dimensione del campo Dictionary_ID è fornita da DID_Field_Size. DID_Field_Size è derivato direttamente dal valore di Dictionary_ID_Flag. Un byte può rappresentare ID 0-255; 2 byte possono rappresentare ID 0-65535; 4 byte possono rappresentare ID 0-4294967295. Il formato è little-endian.
È consentito utilizzare un grande ID dizionario a 4 byte per rappresentare un piccolo ID (ad esempio, 13), anche se questo è inefficiente.
In ambienti privati, può essere utilizzato qualsiasi ID dizionario. Tuttavia, per frame e dizionari distribuiti nello spazio pubblico, Dictionary_ID deve essere assegnato con attenzione. I seguenti intervalli sono riservati solo ai dizionari registrati presso IANA (vedere sezione 7.4):
- Intervallo basso (low range):
<= 32767 - Intervallo alto (high range):
>= (1 << 31)
Qualsiasi altro valore di Dictionary_ID può essere utilizzato tramite accordo privato tra partecipanti.
Qualsiasi payload inviato per la decompressione che fa riferimento a un ID dizionario riservato non registrato comporterà un errore.
3.1.1.1.4. Frame_Content_Size (Dimensione contenuto frame)
Questa è la dimensione originale (non compressa). Questa informazione è facoltativa. Frame_Content_Size utilizza un numero variabile di byte, fornito da FCS_Field_Size. FCS_Field_Size è fornito dal valore di Frame_Content_Size_Flag. FCS_Field_Size può essere uguale a 0 (non presente), 1, 2, 4 o 8 byte.
| FCS Field Size (Dimensione campo) | Range (Intervallo) |
|---|---|
| 0 | unknown (sconosciuto) |
| 1 | 0 - 255 |
| 2 | 256 - 65791 |
| 4 | 0 - 2^32 - 1 |
| 8 | 0 - 2^64 - 1 |
Tabella 7: Frame_Content_Size
Il formato Frame_Content_Size è little-endian. Quando FCS_Field_Size è 1, 4 o 8 byte, il valore viene letto direttamente. Quando FCS_Field_Size è 2, viene aggiunto un offset di 256. È consentito utilizzare qualsiasi variante compatibile per rappresentare una piccola dimensione (ad esempio, 18), anche se questo è inefficiente.