Zum Hauptinhalt springen

9. Format der komprimierten Daten (Compressed Data Format)

9. Format der komprimierten Daten (Compressed Data Format)​

In diesem Abschnitt beschreiben wir das Format des komprimierten Datensatzes im Hinblick auf das Format der einzelnen Datenelemente, die in den vorherigen Abschnitten beschrieben wurden.

9.1. Format des Stream-Headers (Format of the Stream Header)​

Der Stream-Header (Stream Header) hat nur das folgende eine Feld:

1..7 Bits: WBITS, ein Wert im Bereich 10..24, kodiert mit dem folgenden
Code variabler Länge (wie er in den komprimierten Daten erscheint,
wobei die Bits von rechts nach links analysiert werden):

Value Bit Pattern
----- -----------
10 0100001
11 0110001
12 1000001
13 1010001
14 1100001
15 1110001
16 0
17 0000001
18 0011
19 0101
20 0111
21 1001
22 1011
23 1101
24 1111

Beachten Sie, dass Bitmuster 0010001 ungültig ist und nicht
verwendet werden darf.

Die Größe des Schiebefensters (Sliding Window), die der maximale Wert jeder nicht-wörterbuchbasierten Referenz-Rückwärtsdistanz (Non-Dictionary Reference Backward Distance) ist, wird durch die folgende Formel gegeben:

window size = (1 << WBITS) - 16

9.2. Format des Meta-Block-Headers (Format of the Meta-Block Header)​

Ein konformer komprimierter Datensatz hat mindestens einen Meta-Block (Meta-Block). Jeder Meta-Block enthält einen Header mit Informationen über die unkomprimierte Länge des Meta-Blocks und ein Bit, das signalisiert, ob der Meta-Block der letzte ist. Das Format des Meta-Block-Headers ist wie folgt:

1 Bit:  ISLAST, auf 1 gesetzt, wenn dies der letzte Meta-Block ist

1 Bit:  ISLASTEMPTY, wenn auf 1 gesetzt, ist der Meta-Block leer; dieses
        Feld ist nur vorhanden, wenn das ISLAST-Bit gesetzt ist -- wenn es
        1 ist, dann enden der Meta-Block und der Brotli-Stream an diesem Bit,
        wobei alle verbleibenden Bits im letzten Byte des komprimierten Streams
        mit Nullen gefüllt werden (wenn die Füllbits nicht Null sind, sollte
        der Stream als ungültig abgelehnt werden)

2 Bits: MNIBBLES, Anzahl der Nibbles zur Darstellung der unkomprimierten
        Länge, kodiert mit dem folgenden Code fester Länge:

              Value    Bit Pattern
              -----    -----------
                  0             11
                  4             00
                  5             01
                  6             10

        Wenn MNIBBLES 0 ist, ist der Meta-Block leer, d.h., er generiert
        keine unkomprimierten Daten. In diesem Fall hat der Rest des
        Meta-Blocks das folgende Format:

             1 Bit:  reserviert, muss Null sein

             2 Bits: MSKIPBYTES, Anzahl der Bytes zur Darstellung der
                     Metadatenlänge

             MSKIPBYTES * 8 Bits: MSKIPLEN - 1, wobei MSKIPLEN die Anzahl
                     der Metadaten-Bytes ist; dieses Feld ist nur vorhanden,
                     wenn MSKIPBYTES positiv ist; andernfalls ist MSKIPLEN 0
                     (wenn MSKIPBYTES größer als 1 ist und das letzte Byte
                     alle Nullen ist, sollte der Stream als ungültig abgelehnt
                     werden)

             0..7 Bits: Füllbits bis zur nächsten Byte-Grenze, müssen alle
                     Nullen sein

             MSKIPLEN Bytes von Metadaten, nicht Teil der unkomprimierten
                     Daten oder des Schiebefensters

MNIBBLES * 4 Bits: MLEN - 1, wobei MLEN die Länge der unkomprimierten Daten
        des Meta-Blocks in Bytes ist (wenn MNIBBLES größer als 4 ist und das
        letzte Nibble alle Nullen ist, sollte der Stream als ungültig
        abgelehnt werden)

1 Bit:  ISUNCOMPRESSED, wenn auf 1 gesetzt, werden alle Bits komprimierter
        Daten bis zur nächsten Byte-Grenze ignoriert, und der Rest des
        Meta-Blocks enthält MLEN Bytes literaler Daten; dieses Feld ist nur
        vorhanden, wenn das ISLAST-Bit nicht gesetzt ist (wenn die ignorierten
        Bits nicht alle Nullen sind, sollte der Stream als ungültig abgelehnt
        werden)

1..11 Bits: NBLTYPESL, Anzahl der Literal-Blocktypen (Literal Block Types),
        kodiert mit dem folgenden Code variabler Länge (wie er in den
        komprimierten Daten erscheint, wobei die Bits von rechts nach links
        analysiert werden, sodass 0110111 den Wert 12 hat):

                 Value    Bit Pattern
                 -----    -----------
                   1                0
                   2             0001
                 3..4           x0011
                 5..8          xx0101
                 9..16        xxx0111
                17..32       xxxx1001
                33..64      xxxxx1011
                65..128    xxxxxx1101
               129..256   xxxxxxx1111

   Präfixcode über das Blocktyp-Code-Alphabet für Literal-Blocktypen,
      erscheint nur, wenn NBLTYPESL >= 2

   Präfixcode über das Blockzähl-Code-Alphabet für Literal-Blockzählungen,
      erscheint nur, wenn NBLTYPESL >= 2

   Blockzählcode + zusätzliche Bits für erste Literal-Blockzählung,
      erscheint nur, wenn NBLTYPESL >= 2

1..11 Bits: NBLTYPESI, Anzahl der Insert-and-Copy-Blocktypen
            (Insert-and-Copy Block Types), kodiert mit demselben Code
            variabler Länge wie oben

   Präfixcode über das Blocktyp-Code-Alphabet für Insert-and-Copy-Blocktypen,
      erscheint nur, wenn NBLTYPESI >= 2

   Präfixcode über das Blockzähl-Code-Alphabet für Insert-and-Copy-
      Blockzählungen, erscheint nur, wenn NBLTYPESI >= 2

   Blockzählcode + zusätzliche Bits für erste Insert-and-Copy-Blockzählung,
      erscheint nur, wenn NBLTYPESI >= 2

1..11 Bits: NBLTYPESD, Anzahl der Distanz-Blocktypen (Distance Block Types),
            kodiert mit demselben Code variabler Länge wie oben

   Präfixcode über das Blocktyp-Code-Alphabet für Distanz-Blocktypen,
      erscheint nur, wenn NBLTYPESD >= 2

   Präfixcode über das Blockzähl-Code-Alphabet für Distanz-Blockzählungen,
      erscheint nur, wenn NBLTYPESD >= 2

   Blockzählcode + zusätzliche Bits für erste Distanz-Blockzählung,
      erscheint nur, wenn NBLTYPESD >= 2

2 Bits: NPOSTFIX, Parameter, der in der Distanzkodierung verwendet wird

4 Bits: vier höchstwertigsten Bits von NDIRECT, um den tatsächlichen Wert
        des Parameters NDIRECT zu erhalten, verschieben Sie diese Vier-Bit-
        Zahl um NPOSTFIX Bits nach links

NBLTYPESL * 2 Bits: Kontextmodus für jeden Literal-Blocktyp

1..11 Bits: NTREESL, Anzahl der Literal-Präfixbäume, kodiert mit demselben
            Code variabler Länge wie NBLTYPESL

   Literal-Kontextkarte, kodiert wie in Abschnitt 7.3 beschrieben,
      erscheint nur, wenn NTREESL >= 2; andernfalls hat die Kontextkarte
      nur Nullwerte

1..11 Bits: NTREESD, Anzahl der Distanz-Präfixbäume, kodiert mit demselben
            Code variabler Länge wie NBLTYPESD

   Distanz-Kontextkarte, kodiert wie in Abschnitt 7.3 beschrieben,
      erscheint nur, wenn NTREESD >= 2; andernfalls hat die Kontextkarte
      nur Nullwerte

NTREESL Präfixcodes für Literale

NBLTYPESI Präfixcodes für Insert-and-Copy-Längen

NTREESD Präfixcodes für Distanzen

9.3. Format der Meta-Block-Daten (Format of the Meta-Block Data)​

Der komprimierte Datenteil eines Meta-Blocks besteht aus einer Serie von Befehlen (Commands). Jeder Befehl hat das folgende Format:

Blocktyp-Code für nächsten Insert-and-Copy-Blocktyp, erscheint nur, wenn
NBLTYPESI >= 2 und die vorherige Insert-and-Copy-Blockzählung Null ist

Blockzählcode + zusätzliche Bits für nächste Insert-and-Copy-Blockzählung,
erscheint nur, wenn NBLTYPESI >= 2 und die vorherige Insert-and-Copy-
Blockzählung Null ist

Insert-and-Copy-Länge, kodiert wie in Abschnitt 5, unter Verwendung des
Insert-and-Copy-Längenpräfixcodes mit dem aktuellen Insert-and-Copy-
Blocktypindex

Einfügelänge Anzahl von Literalen, mit dem folgenden Format:

Blocktyp-Code für nächsten Literal-Blocktyp, erscheint nur, wenn
NBLTYPESL >= 2 und die vorherige Literal-Blockzählung Null ist

Blockzählcode + zusätzliche Bits für nächste Literal-Blockzählung,
erscheint nur, wenn NBLTYPESL >= 2 und die vorherige Literal-
Blockzählung Null ist

Nächstes Byte der unkomprimierten Daten, kodiert mit dem Literal-
Präfixcode mit dem Index, der durch die vorherigen zwei Bytes der
unkomprimierten Daten, den aktuellen Literal-Blocktyp und die
Kontextkarte bestimmt wird, wie in Abschnitt 7.3 beschrieben

Blocktyp-Code für nächsten Distanz-Blocktyp, erscheint nur, wenn
NBLTYPESD >= 2 und die vorherige Distanz-Blockzählung Null ist

Blockzählcode + zusätzliche Bits für nächste Distanz-Blockzählung,
erscheint nur, wenn NBLTYPESD >= 2 und die vorherige Distanz-
Blockzählung Null ist

Distanzcode, kodiert wie in Abschnitt 4, unter Verwendung des Distanz-
Präfixcodes mit dem Index, der durch die Kopierlänge, den aktuellen
Distanz-Blocktyp und die Distanz-Kontextkarte bestimmt wird, wie in
Abschnitt 7.3 beschrieben, erscheint nur, wenn der Distanzcode keine
implizite 0 ist, wie durch den Insert-and-Copy-Längencode angegeben

Die Anzahl der Befehle im Meta-Block ist so, dass die Summe der erzeugten unkomprimierten Bytes (d.h. die Anzahl der eingefügten Literale plus die Anzahl der aus vergangenen Daten kopierten Bytes oder aus dem statischen Wörterbuch generierten Bytes) über alle Befehle die unkomprimierte Länge MLEN ergibt, die im Meta-Block-Header kodiert ist.

Wenn die Gesamtzahl der erzeugten unkomprimierten Bytes nach dem Einfügeteil des letzten Befehls gleich MLEN ist, wird die Kopierlänge des letzten Befehls ignoriert und erzeugt keine unkomprimierte Ausgabe. In diesem Fall kann die Kopierlänge des letzten Befehls einen beliebigen Wert haben. In jedem anderen Fall sollte der Stream als ungültig abgelehnt werden, wenn die Anzahl der einzufügenden Literale, die Kopierlänge oder die resultierende Wörterbuch-Wortlänge dazu führen würde, dass MLEN überschritten wird.

Wenn der letzte Befehl des letzten nicht leeren Meta-Blocks nicht an einer Byte-Grenze endet, müssen die ungenutzten Bits im letzten Byte Nullen sein.


Quelle (Source): RFC 7932, Section 9
Offizieller Text (Official Text): https://www.rfc-editor.org/rfc/rfc7932.txt