3.1.1.2. Blocks (Blöcke)
Nach Magic_Number und Frame_Header folgen mehrere Blöcke. Jeder Rahmen muss mindestens 1 Block haben, aber es gibt keine Obergrenze für die Anzahl der Blöcke pro Rahmen.
Die Struktur eines Blocks ist wie folgt:
+==============+===============+
|| Block_Header | Block_Content |
+==============+===============+
|| 3 bytes | n bytes |
+--------------+---------------+
Tabelle 8: Struktur eines Blocks
Block_Header verwendet 3 Bytes, geschrieben unter Verwendung der Little-Endian-Konvention. Es enthält drei Felder:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
Tabelle 9: Block_Header
3.1.1.2.1. Last_Block (Letzter Block)
Das niedrigstwertige Bit (Last_Block) zeigt an, ob dies der letzte Block ist. Der Rahmen endet nach diesem letzten Block. Ihm kann eine optionale Content_Checksum folgen (siehe Abschnitt 3.1.1).
3.1.1.2.2. Block_Type (Blocktyp)
Die nächsten 2 Bits repräsentieren den Block_Type. Es gibt vier Blocktypen:
| Value (Wert) | Block_Type (Blocktyp) |
|---|---|
| 0 | Raw_Block (Rohblock) |
| 1 | RLE_Block (RLE-Block) |
| 2 | Compressed_Block (Komprimierter Block) |
| 3 | Reserved (Reserviert) |
Tabelle 10: Vier Blocktypen
Raw_Block (Rohblock) : Dies ist ein unkomprimierter Block. Block_Content enthält Block_Size Bytes.
RLE_Block (RLE-Block) : Dies ist ein einzelnes Byte, das Block_Size-mal wiederholt wird. Block_Content besteht aus einem einzelnen Byte. Auf der Dekompressionsseite muss dieses Byte Block_Size-mal wiederholt werden.
Compressed_Block (Komprimierter Block) : Dies ist der in Abschnitt 3.1.1.3 beschriebene komprimierte Block. Block_Size ist die Länge von Block_Content, d.h. der komprimierten Daten. Die dekomprimierte Größe ist unbekannt, aber ihr maximaler möglicher Wert ist garantiert (siehe unten).
Reserved (Reserviert) : Dies ist kein Block. Dieser Wert kann mit der aktuellen Spezifikation nicht verwendet werden. Wenn ein solcher Wert vorhanden ist, wird er als beschädigte Daten betrachtet, und ein spezifikationskonformer Decoder muss ihn ablehnen.
3.1.1.2.3. Block_Size (Blockgröße)
Die oberen 21 Bits des Block_Header repräsentieren die Block_Size.
Wenn Block_Type Compressed_Block oder Raw_Block ist, ist Block_Size die Größe von Block_Content (enthält also nicht den Block_Header).
Wenn Block_Type RLE_Block ist, da die Größe von Block_Content immer 1 ist, repräsentiert Block_Size die Anzahl der Male, die dieses Byte wiederholt werden muss.
Block_Size wird durch Block_Maximum_Size begrenzt (siehe unten).
3.1.1.2.4. Block_Content and Block_Maximum_Size (Blockinhalt und maximale Blockgröße)
Die Größe von Block_Content wird durch Block_Maximum_Size begrenzt, was das kleinere der beiden folgenden ist:
- Window_Size
- 128 KB
Block_Maximum_Size ist für einen gegebenen Rahmen konstant. Dieses Maximum gilt sowohl für die dekomprimierte Größe als auch für die komprimierte Größe eines beliebigen Blocks im Rahmen.
Die Begründung für diese Begrenzung ist, dass der Decoder diese Informationen zu Beginn des Rahmens lesen und sie verwenden kann, um Puffer zuzuweisen. Die Garantie der Blockgröße stellt sicher, dass der Puffer für alle nachfolgenden Blöcke eines gültigen Rahmens ausreichend ist.
Wenn ein komprimierter Block größer als ein unkomprimierter Block ist, wird empfohlen, stattdessen einen unkomprimierten Block (d.h. Raw_Block) zu senden.