Zum Hauptinhalt springen

5. Primitive Typdarstellungen (Primitive Type Representations)

Die HPACK-Kodierung verwendet zwei primitive Typen: vorzeichenlose Ganzzahlen variabler Länge und Zeichenketten aus Oktetten.

5.1. Ganzzahldarstellung (Integer Representation)

Ganzzahlen werden verwendet, um Namensindizes, Header-Feld-Indizes oder Zeichenkettenlängen darzustellen. Eine Ganzzahldarstellung kann überall innerhalb eines Oktetts beginnen. Um eine optimierte Verarbeitung zu ermöglichen, endet eine Ganzzahldarstellung immer am Ende eines Oktetts.

Eine Ganzzahl wird in zwei Teilen dargestellt: einem Präfix, das das aktuelle Oktett füllt, und einer optionalen Liste von Oktetten, die verwendet werden, wenn der Ganzzahlwert nicht in das Präfix passt. Die Anzahl der Bits des Präfixes (genannt N) ist ein Parameter der Ganzzahldarstellung.

Wenn der Ganzzahlwert klein genug ist, d.h. strikt kleiner als 2^N-1, wird er innerhalb des N-Bit-Präfixes kodiert.

Andernfalls werden alle Bits des Präfixes auf 1 gesetzt, und der Wert, verringert um 2^N-1, wird unter Verwendung einer Liste von einem oder mehreren Oktetten kodiert. Das höchstwertige Bit jedes Oktetts wird als Fortsetzungsflagge verwendet: sein Wert wird auf 1 gesetzt, außer für das letzte Oktett in der Liste. Die verbleibenden Bits der Oktette werden verwendet, um den verringerten Wert zu kodieren.

Pseudocode zur Darstellung einer Ganzzahl I:

if I < 2^N - 1, encode I on N bits
else
encode (2^N - 1) on N bits
I = I - (2^N - 1)
while I >= 128
encode (I % 128 + 128) on 8 bits
I = I / 128
encode I on 8 bits

Pseudocode zur Dekodierung einer Ganzzahl I:

decode I from the next N bits
if I < 2^N - 1, return I
else
M = 0
repeat
B = next octet
I = I + (B & 127) * 2^M
M = M + 7
while B & 128 == 128
return I

Beispiele zur Veranschaulichung der Kodierung von Ganzzahlen sind in Anhang C.1 verfügbar.

Diese Ganzzahldarstellung ermöglicht Werte unbegrenzter Größe. Es ist auch möglich, dass ein Encoder eine große Anzahl von Nullwerten sendet, was Oktette verschwenden und zum Überlauf von Ganzzahlwerten verwendet werden könnte. Ganzzahlkodierungen, die Implementierungsgrenzen überschreiten -- in Wert oder Oktettlänge -- MÜSSEN als Dekodierungsfehler behandelt werden. Verschiedene Grenzen können für jede der verschiedenen Verwendungen von Ganzzahlen basierend auf Implementierungsbeschränkungen festgelegt werden.

5.2. Zeichenketten-Literaldarstellung (String Literal Representation)

Header-Feldnamen und Header-Feldwerte können als Zeichenketten-Literale dargestellt werden. Ein Zeichenketten-Literal wird als Sequenz von Oktetten kodiert, entweder durch direkte Kodierung der Oktette des Zeichenketten-Literals oder durch Verwendung eines Huffman-Codes (siehe [HUFFMAN]).

Eine Zeichenketten-Literaldarstellung enthält die folgenden Felder:

H: Ein Ein-Bit-Flag H, das angibt, ob die Oktette der Zeichenkette Huffman-kodiert sind oder nicht.

Zeichenkettenlänge (String Length): Die Anzahl der Oktette, die zur Kodierung des Zeichenketten-Literals verwendet werden, kodiert als Ganzzahl mit einem 7-Bit-Präfix (siehe Abschnitt 5.1).

Zeichenkettendaten (String Data): Die kodierten Daten des Zeichenketten-Literals. Wenn H '0' ist, sind die kodierten Daten die rohen Oktette des Zeichenketten-Literals. Wenn H '1' ist, sind die kodierten Daten die Huffman-Kodierung des Zeichenketten-Literals.

Zeichenketten-Literale, die Huffman-Kodierung verwenden, werden mit dem in Anhang B definierten Huffman-Code kodiert.