Zum Hauptinhalt springen

16. Variable-Length Integer Encoding

16. Variable-Length Integer Encoding

QUIC-Pakete und -Frames verwenden häufig eine Variable-Length-Codierung für nicht-negative Ganzzahlwerte. Diese Codierung stellt sicher, dass kleinere Ganzzahlwerte weniger Bytes zur Codierung benötigen.

Die QUIC Variable-Length-Integer-Codierung reserviert die zwei höchstwertigen Bits des ersten Bytes, um den Basis-2-Logarithmus der Ganzzahl-Codierungslänge in Bytes zu codieren. Der Ganzzahlwert wird auf den verbleibenden Bits in Netzwerk-Byte-Reihenfolge codiert.

Dies bedeutet, dass Ganzzahlen in 1, 2, 4 oder 8 Bytes codiert werden und 6-, 14-, 30- bzw. 62-Bit-Werte codieren können. Tabelle 4 fasst die Codierungseigenschaften zusammen.

2BitLängeNutzbare BitsBereich
00160-63
012140-16383
104300-1073741823
118620-4611686018427387903

Tabelle 4: Zusammenfassung der Ganzzahl-Codierungen

Zum Beispiel decodiert die Acht-Byte-Sequenz 0xc2 0x19 0x7c 0x5e 0xff 0x14 0xe8 0x8c (in Hexadezimal) zum Dezimalwert 151288809941952652; die Vier-Byte-Sequenz 0x9d 0x7f 0x3e 0x7d decodiert zu 494878333; die Zwei-Byte-Sequenz 0x7b 0xbd decodiert zu 15293; und das einzelne Byte 0x25 decodiert zu 37 (wie auch die Zwei-Byte-Sequenz 0x40 0x25).

Werte müssen nicht in der minimal notwendigen Anzahl von Bytes codiert werden.

Ein Endpunkt KANN Werte verwenden, die größer als unbedingt notwendig sind, um einen Wert zu codieren. Beispielsweise könnte eine Zwei-Byte-Codierung verwendet werden, um Werte kleiner als 64 zu codieren.

Versionen (Abschnitt 15), Paketnummern, die im Header gesendet werden (Abschnitt 17.1), und Frame-Typen (Abschnitt 19) werden alle mit Ganzzahlen beschrieben, verwenden jedoch nicht diese Codierung.