メインコンテンツまでスキップ

5. プリミティブ型表現 (Primitive Type Representations)

HPACKエンコーディングは、2つのプリミティブ型を使用します: 符号なし可変長整数とオクテットの文字列。

5.1. 整数表現 (Integer Representation)

整数は、名前インデックス、ヘッダーフィールドインデックス、または文字列長を表すために使用されます。整数表現はオクテット内の任意の場所で開始できます。最適化された処理を可能にするために、整数表現は常にオクテットの終わりで終了します。

整数は2つの部分で表現されます: 現在のオクテットを埋めるプレフィックスと、整数値がプレフィックス内に収まらない場合に使用されるオプションのオクテットのリスト。プレフィックスのビット数 (Nと呼ばれる) は、整数表現のパラメータです。

整数値が十分に小さい場合、つまり、厳密に2^N-1未満の場合、Nビットのプレフィックス内でエンコードされます。

それ以外の場合、プレフィックスのすべてのビットが1に設定され、2^N-1だけ減少した値が、1つ以上のオクテットのリストを使用してエンコードされます。各オクテットの最上位ビットは継続フラグとして使用されます: その値は、リスト内の最後のオクテットを除いて1に設定されます。オクテットの残りのビットは、減少した値をエンコードするために使用されます。

整数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

整数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

整数のエンコーディングを示す例は、付録C.1にあります。

この整数表現は、無期限のサイズの値を可能にします。エンコーダーが多数のゼロ値を送信することも可能であり、これはオクテットを浪費し、整数値をオーバーフローさせるために使用される可能性があります。実装制限 (値またはオクテット長) を超える整数エンコーディングは、デコーディングエラーとして扱わなければなりません (MUST)。実装の制約に基づいて、整数のさまざまな使用ごとに異なる制限を設定できます。

5.2. 文字列リテラル表現 (String Literal Representation)

ヘッダーフィールド名とヘッダーフィールド値は、文字列リテラル (String Literal) として表現できます。文字列リテラルは、文字列リテラルのオクテットを直接エンコードするか、ハフマン符号を使用することによって、オクテットのシーケンスとしてエンコードされます ([HUFFMAN]参照)。

文字列リテラル表現には、次のフィールドが含まれます:

H: 文字列のオクテットがハフマンエンコードされているかどうかを示す1ビットフラグH。

文字列長 (String Length): 文字列リテラルのエンコードに使用されるオクテット数で、7ビットプレフィックスを持つ整数としてエンコードされます (第5.1節参照)。

文字列データ (String Data): 文字列リテラルのエンコードされたデータ。Hが'0'の場合、エンコードされたデータは文字列リテラルの生のオクテットです。Hが'1'の場合、エンコードされたデータは文字列リテラルのハフマンエンコーディングです。

ハフマンエンコーディングを使用する文字列リテラルは、付録Bで定義されたハフマン符号でエンコードされます。