Zum Hauptinhalt springen

3.1.1.1. Frame Header (Rahmen-Header)

Die Größe des Rahmen-Headers ist variabel, minimal 2 Byte und maximal 14 Byte, abhängig von optionalen Parametern. Die Struktur von Frame_Header ist wie folgt:

+-------------------------+-----------+
|| Frame_Header_Descriptor | 1 byte |
+-------------------------+-----------+
|| [Window_Descriptor] | 0-1 byte |
+-------------------------+-----------+
|| [Dictionary_ID] | 0-4 bytes |
+-------------------------+-----------+
|| [Frame_Content_Size] | 0-8 bytes |
+-------------------------+-----------+

Tabelle 2: Struktur von Frame_Header

3.1.1.1.1. Frame_Header_Descriptor (Rahmen-Header-Descriptor)

Das erste Byte des Headers wird als Frame_Header_Descriptor bezeichnet. Es beschreibt, welche anderen Felder vorhanden sind. Das Decodieren dieses Bytes reicht aus, um die Größe von Frame_Header zu bestimmen.

Bitnummer (Bit Number)Feldname (Field Name)
7-6Frame_Content_Size_Flag
5Single_Segment_Flag
4(unbenutzt, unused)
3(reserviert, reserved)
2Content_Checksum_Flag
1-0Dictionary_ID_Flag

Tabelle 3: Frame_Header_Descriptor

In Tabelle 3 ist Bit 7 das höchstwertige Bit und Bit 0 das niederwertigste Bit.

3.1.1.1.1.1. Frame_Content_Size_Flag (Rahmen-Inhaltsgröße-Flag)

Dies ist ein 2-Bit-Flag (entspricht Frame_Header_Descriptor rechts verschoben um 6 Bits), das angibt, ob Frame_Content_Size (dekomprimierte Datengröße) im Header bereitgestellt wird. Frame_Content_Size_Flag liefert FCS_Field_Size, die Anzahl der Bytes, die Frame_Content_Size gemäß Tabelle 4 verwendet:

Frame_Content_Size_Flag0123
FCS_Field_Size0 oder 1248

Tabelle 4: Frame_Content_Size_Flag liefert FCS_Field_Size

Wenn Frame_Content_Size_Flag 0 ist, hängt FCS_Field_Size von Single_Segment_Flag ab: Wenn Single_Segment_Flag gesetzt ist, ist FCS_Field_Size 1. Andernfalls ist FCS_Field_Size 0; Frame_Content_Size wird nicht bereitgestellt.

3.1.1.1.1.2. Single_Segment_Flag (Einzelsegment-Flag)

Wenn dieses Flag gesetzt ist, müssen die Daten in einem einzelnen zusammenhängenden Speichersegment regeneriert werden.

In diesem Fall wird das Window_Descriptor-Byte übersprungen, aber Frame_Content_Size muss vorhanden sein. Daher muss der Decoder ein Speichersegment zuweisen, dessen Größe gleich oder größer als Frame_Content_Size ist.

Um den Decoder vor unzumutbaren Speicheranforderungen zu schützen, ist es dem Decoder gestattet, komprimierte Rahmen abzulehnen, die Speichergrößen anfordern, die über den vom Decoder autorisierten Bereich hinausgehen.

Für eine breitere Kompatibilität wird empfohlen, dass Decoder mindestens eine Speichergröße von 8 MB unterstützen. Dies ist nur eine Empfehlung; jeder Decoder kann basierend auf lokalen Einschränkungen frei höhere oder niedrigere Grenzen unterstützen.

3.1.1.1.1.3. Unused Bit (Unbenutztes Bit)

Ein Decoder, der dieser Version der Spezifikation entspricht, darf dieses Bit nicht interpretieren. Es kann in zukünftigen Versionen verwendet werden, um Attribute darzustellen, die für die korrekte Dekodierung des Rahmens nicht erforderlich sind. Ein Encoder, der dieser Spezifikation entspricht, muss dieses Bit auf Null setzen.

3.1.1.1.1.4. Reserved Bit (Reserviertes Bit)

Dieses Bit ist für zukünftige Funktionen reserviert. Sein Wert muss Null sein. Ein Decoder, der dieser Version der Spezifikation entspricht, muss sicherstellen, dass es nicht gesetzt ist. Dieses Bit kann in zukünftigen Revisionen verwendet werden, um Funktionen darzustellen, die interpretiert werden müssen, um den Rahmen korrekt zu dekodieren.

3.1.1.1.1.5. Content_Checksum_Flag (Inhalts-Prüfsummen-Flag)

Wenn dieses Flag gesetzt ist, ist am Ende des Rahmens eine 32-Bit-Content_Checksum vorhanden. Siehe die obige Beschreibung von Content_Checksum.

3.1.1.1.1.6. Dictionary_ID_Flag (Wörterbuch-ID-Flag)

Dies ist ein 2-Bit-Flag (= Frame_Header_Descriptor & 0x3), das angibt, ob eine Wörterbuch-ID im Header bereitgestellt wird. Es gibt auch die Größe dieses Felds als DID_Field_Size an:

Dictionary_ID_Flag0123
DID_Field_Size0124

Tabelle 5: Dictionary_ID_Flag

3.1.1.1.2. Window Descriptor (Fenster-Descriptor)

Dies bietet eine Garantie für den minimalen Speicherpuffer, der zum Dekomprimieren des Rahmens erforderlich ist. Diese Information ist wichtig, damit der Decoder ausreichend Speicher zuweisen kann.

Das Window_Descriptor-Byte ist optional. Wenn Single_Segment_Flag gesetzt ist, ist Window_Descriptor nicht vorhanden. In diesem Fall ist Window_Size gleich Frame_Content_Size, und sein Wert kann von 0 bis 2^64 - 1 Bytes (16 ExaBytes) reichen.

Bitnummer (Bit Number)7-32-0
Feldname (Field Name)ExponentMantissa (Mantisse)

Tabelle 6: Window_Descriptor

Die minimale Speicherpuffergröße wird als Window_Size bezeichnet. Sie wird durch folgende Formel beschrieben:

windowLog = 10 + Exponent;
windowBase = 1 << windowLog;
windowAdd = (windowBase / 8) * Mantissa;
Window_Size = windowBase + windowAdd;

Die minimale Window_Size beträgt 1 KB. Die maximale Window_Size beträgt (1<<41) + 7*(1<<38) Bytes, d.h. 3.75 TB.

Im Allgemeinen tendieren größere Window_Size-Werte dazu, das Kompressionsverhältnis zu verbessern, auf Kosten erhöhter Speichernutzung.

Um komprimierte Daten korrekt zu dekodieren, muss der Decoder einen Puffer von mindestens Window_Size Bytes zuweisen.

Um den Decoder vor unzumutbaren Speicheranforderungen zu schützen, ist es dem Decoder gestattet, komprimierte Rahmen abzulehnen, die Speichergrößen anfordern, die über den vom Decoder autorisierten Bereich hinausgehen.

Um die Interoperabilität zu verbessern, wird empfohlen, dass Decoder Window_Size-Werte bis zu 8 MB unterstützen und Encoder keine Rahmen generieren, die eine Window_Size von mehr als 8 MB erfordern. Dies ist nur eine Empfehlung, und Decoder können basierend auf lokalen Einschränkungen frei höhere oder niedrigere Grenzen unterstützen.

3.1.1.1.3. Dictionary_ID (Wörterbuch-ID)

Dies ist ein Feld variabler Größe, das die Wörterbuch-ID enthält, die erforderlich ist, um den Rahmen korrekt zu dekodieren. Dieses Feld ist optional. Wenn es nicht vorhanden ist, liegt es am Decoder zu entscheiden, welches Wörterbuch verwendet werden soll.

Die Größe des Dictionary_ID-Felds wird von DID_Field_Size bereitgestellt. DID_Field_Size wird direkt vom Wert von Dictionary_ID_Flag abgeleitet. Ein Byte kann IDs von 0-255 darstellen; 2 Bytes können IDs von 0-65535 darstellen; 4 Bytes können IDs von 0-4294967295 darstellen. Das Format ist Little-Endian.

Es ist erlaubt, eine große 4-Byte-Wörterbuch-ID zu verwenden, um eine kleine ID (z.B. 13) darzustellen, auch wenn dies ineffizient ist.

In privaten Umgebungen kann jede Wörterbuch-ID verwendet werden. Für Rahmen und Wörterbücher, die im öffentlichen Raum verteilt werden, muss Dictionary_ID jedoch sorgfältig zugewiesen werden. Die folgenden Bereiche sind nur für bei IANA registrierte Wörterbücher reserviert (siehe Abschnitt 7.4):

  • Niedriger Bereich (low range): <= 32767
  • Hoher Bereich (high range): >= (1 << 31)

Jeder andere Wert von Dictionary_ID kann durch private Vereinbarung zwischen Teilnehmern verwendet werden.

Jede Nutzlast, die zur Dekompression eingereicht wird und auf eine nicht registrierte reservierte Wörterbuch-ID verweist, führt zu einem Fehler.

3.1.1.1.4. Frame_Content_Size (Rahmen-Inhaltsgröße)

Dies ist die ursprüngliche (unkomprimierte) Größe. Diese Information ist optional. Frame_Content_Size verwendet eine variable Anzahl von Bytes, die von FCS_Field_Size bereitgestellt wird. FCS_Field_Size wird vom Wert von Frame_Content_Size_Flag bereitgestellt. FCS_Field_Size kann gleich 0 (nicht vorhanden), 1, 2, 4 oder 8 Bytes sein.

FCS Field Size (Feldgröße)Range (Bereich)
0unknown (unbekannt)
10 - 255
2256 - 65791
40 - 2^32 - 1
80 - 2^64 - 1

Tabelle 7: Frame_Content_Size

Das Frame_Content_Size-Format ist Little-Endian. Wenn FCS_Field_Size 1, 4 oder 8 Bytes beträgt, wird der Wert direkt gelesen. Wenn FCS_Field_Size 2 beträgt, wird ein Offset von 256 hinzugefügt. Es ist erlaubt, jede kompatible Variante zu verwenden, um eine kleine Größe (z.B. 18) darzustellen, auch wenn dies ineffizient ist.