6. Kodierung von Blockwechselbefehlen (Encoding of Block-Switch Commands)
6. Kodierung von Blockwechselbefehlen (Encoding of Block-Switch Commands)
Wie in Abschnitt 2 beschrieben, ist ein Blockwechselbefehl (Block-Switch Command) ein Paar <block type, block count>. Diese werden im komprimierten Datenteil des Meta-Blocks kodiert, direkt vor dem Start jedes neuen Blocks einer bestimmten Blockkategorie.
Jeder Blocktyp (Block Type) in den komprimierten Daten wird durch einen Blocktypcode (Block Type Code) dargestellt, der unter Verwendung eines Präfixcodes über dem Blocktypcode-Alphabet kodiert wird. Ein Blocktypsymbol 0 bedeutet, dass der neue Blocktyp derselbe ist wie der Typ des vorherigen Blocks derselben Blockkategorie, d.h. der Blocktyp, der dem aktuellen Typ vorausging, während ein Blocktypsymbol 1 bedeutet, dass der neue Blocktyp gleich dem aktuellen Blocktyp plus eins ist. Wenn der aktuelle Blocktyp der maximal mögliche ist, führt ein Blocktypsymbol von 1 zu einem Umbruch zu einem neuen Blocktyp von 0. Blocktypsymbole 2..257 repräsentieren Blocktypen 0..255 bzw. Die vorherigen und aktuellen Blocktypen werden am Ende des Meta-Block-Headers auf 1 bzw. 0 initialisiert.
Da der erste Blocktyp jeder Blockkategorie 0 ist, wird der Blocktyp des ersten Blockwechselbefehls nicht in den komprimierten Daten kodiert. Wenn eine Blockkategorie nur einen Blocktyp hat, wird auch die Blockanzahl (Block Count) des ersten Blockwechselbefehls aus den komprimierten Daten weggelassen; andernfalls wird sie im Meta-Block-Header kodiert.
Da das Ende des Meta-Blocks durch die Anzahl der produzierten unkomprimierten Bytes erkannt wird, müssen die Blockanzahlen für keine der drei Kategorien am Ende des Meta-Blocks genau auf null herunterzählen.
Die Anzahl der verschiedenen Blocktypen in jeder Blockkategorie, bezeichnet durch NBLTYPESL, NBLTYPESI und NBLTYPESD für Literale, Einfüge- und Kopierlängen bzw. Distanzen, wird im Meta-Block-Header kodiert und muss gleich dem größten Blocktyp plus eins in dieser Blockkategorie sein. Mit anderen Worten, die Menge der Literal-, Einfüge- und Kopierlängen- und Distanzblocktypen muss jeweils [0..NBLTYPESL-1], [0..NBLTYPESI-1] und [0..NBLTYPESD-1] sein. Daraus folgt, dass die Alphabetgröße der Literal-, Einfüge- und Kopierlängen- und Distanzblocktypencodes jeweils NBLTYPESL + 2, NBLTYPESI + 2 und NBLTYPESD + 2 ist.
Jede Blockanzahl in den komprimierten Daten wird durch ein Paar <block count code, extra bits> dargestellt. Der Blockanzahlcode (Block Count Code) und die Extrabits (Extra Bits) werden hintereinander kodiert, der Blockanzahlcode wird unter Verwendung eines Präfixcodes über dem Blockanzahlcode-Alphabet kodiert, während der Extrabitswert als ganzzahliger Wert fester Breite kodiert wird. Die Anzahl der Extrabits kann 0..24 betragen und ist vom Blockanzahlcode abhängig.
Die Symbole des Blockanzahlcode-Alphabets zusammen mit der Anzahl der Extrabits und dem Bereich der Blockanzahlen sind wie folgt:
Extra Extra Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 2 1..4 9 4 65..80 18 7 369..496
1 2 5..8 10 4 81..96 19 8 497..752
2 2 9..12 11 4 97..112 20 9 753..1264
3 2 13..16 12 5 113..144 21 10 1265..2288
4 3 17..24 13 5 145..176 22 11 2289..4336
5 3 25..32 14 5 177..208 23 12 4337..8432
6 3 33..40 15 5 209..240 24 13 8433..16624
7 3 41..48 16 6 241..304 25 24 16625..16793840
8 4 49..64 17 6 305..368
Der erste Blockwechselbefehl jeder Blockkategorie ist insofern speziell, als er im Meta-Block-Header kodiert wird, und wie zuvor beschrieben, wird der Blocktypcode weggelassen, da er implizit null ist.
Quelle (Source): RFC 7932, Section 6
Offizieller Text (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt