Zum Hauptinhalt springen

5. Kodierung von Literal-Einfügelängen und Kopierlängen (Encoding of Literal Insertion Lengths and Copy Lengths)

5. Kodierung von Literal-Einfügelängen und Kopierlängen (Encoding of Literal Insertion Lengths and Copy Lengths)

Wie in Abschnitt 2 beschrieben, werden die Literal-Einfügelängen (Literal Insertion Lengths) und die Rückwärtskopierlängen (Backward Copy Lengths) unter Verwendung eines einzelnen Präfixcodes kodiert. Dieser Abschnitt liefert die Details zu dieser Kodierung.

Jedes <insertion length, copy length> Paar im komprimierten Datenteil eines Meta-Blocks wird durch das folgende Tripel dargestellt:

<insert-and-copy length code, insert extra bits, copy extra bits>

Der Einfüge- und Kopierlängencode (Insert-and-Copy Length Code), die Einfüge-Extrabits (Insert Extra Bits) und die Kopier-Extrabits (Copy Extra Bits) werden hintereinander kodiert, der Einfüge- und Kopierlängencode wird unter Verwendung eines Präfixcodes über dem Einfüge- und Kopierlängencode-Alphabet kodiert, während die Extrabitswerte als ganzzahlige Werte fester Breite kodiert werden. Die Anzahl der Einfüge- und Kopier-Extrabits kann 0..24 betragen, und sie sind vom Einfüge- und Kopierlängencode abhängig.

Einige der Einfüge- und Kopierlängencodes drücken auch die Tatsache aus, dass das Distanzsymbol der Distanz im selben Befehl 0 ist, d.h. die Distanzkomponente des Befehls ist dieselbe wie die des vorherigen Befehls. In diesem Fall werden der Distanzcode und die Extrabits für die Distanz aus dem komprimierten Datenstrom weggelassen.

Wir beschreiben das Einfüge- und Kopierlängencode-Alphabet in Bezug auf die (nicht direkt verwendeten) Einfügelängencode (Insert Length Code) und Kopierlängencode (Copy Length Code) Alphabete. Die Symbole des Einfügelängencode-Alphabets zusammen mit der Anzahl der Einfüge-Extrabits und dem Bereich der Einfügelängen sind wie folgt:

        Extra              Extra               Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 0 8 2 10..13 16 6 130..193
1 0 1 9 2 14..17 17 7 194..321
2 0 2 10 3 18..25 18 8 322..577
3 0 3 11 3 26..33 19 9 578..1089
4 0 4 12 4 34..49 20 10 1090..2113
5 0 5 13 4 50..65 21 12 2114..6209
6 1 6,7 14 5 66..97 22 14 6210..22593
7 1 8,9 15 5 98..129 23 24 22594..16799809

Die Symbole des Kopierlängencode-Alphabets zusammen mit der Anzahl der Kopier-Extrabits und dem Bereich der Kopierlängen sind wie folgt:

        Extra              Extra               Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 0 2 8 1 10,11 16 5 70..101
1 0 3 9 1 12,13 17 5 102..133
2 0 4 10 2 14..17 18 6 134..197
3 0 5 11 2 18..21 19 7 198..325
4 0 6 12 3 22..29 20 8 326..581
5 0 7 13 3 30..37 21 9 582..1093
6 0 8 14 4 38..53 22 10 1094..2117
7 0 9 15 4 54..69 23 24 2118..16779333

Um einen Einfüge- und Kopierlängencode in einen Einfügelängencode und einen Kopierlängencode zu konvertieren, kann die folgende Tabelle verwendet werden:

       Insert
length Copy length code
code 0..7 8..15 16..23
+----------+----------+
| | |
0..7 | 0..63 | 64..127 | <--- distance symbol 0
| | |
+----------+----------+----------+
| | | |
0..7 | 128..191 | 192..255 | 384..447 |
| | | |
+----------+----------+----------+
| | | |
8..15 | 256..319 | 320..383 | 512..575 |
| | | |
+----------+----------+----------+
| | | |
16..23 | 448..511 | 576..639 | 640..703 |
| | | |
+----------+----------+----------+

Suchen Sie zuerst die Zelle mit dem 64-Werte-Bereich, der den Einfüge- und Kopierlängencode enthält; dies ergibt die Einfügelängencode- und Kopierlängencode-Bereiche, beide 8 Werte lang. Der Kopierlängencode innerhalb seines Bereichs wird durch die Bits 0..2 (vom lsb gezählt) des Einfüge- und Kopierlängencodes bestimmt. Der Einfügelängencode innerhalb seines Bereichs wird durch die Bits 3..5 (vom lsb gezählt) des Einfüge- und Kopierlängencodes bestimmt. Bei gegebenen Einfügelängen- und Kopierlängencodes können die tatsächlichen Einfüge- und Kopierlängen durch Lesen der Anzahl der Extrabits erhalten werden, die durch die obigen Tabellen angegeben werden.

Wenn der Einfüge- und Kopierlängencode zwischen 0 und 127 liegt, wird der Distanzcode des Befehls auf null gesetzt (die letzte Distanz wird wiederverwendet).


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