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

2. 型付き配列

2. 型付き配列

型付き配列は、数値からなる同種配列であり、その全要素が単一の二進表現形式で符号化される。これらの表現の連結は、単一の CBOR バイト文字列 (メジャータイプ 2) として符号化され、バイト文字列に表現される全ての数値の型と符号化を示す単一のタグによって囲まれる。

2.1 数値の種類

関心のある数値のクラスは 3 つである: 符号無し整数 (uint)、符号付き整数 (2 の補数, sint)、および IEEE 754 二進浮動小数点数 (常に符号付き) である。これら各クラスには、現在使用されている複数の表現長がある:

             +-----------+--------+--------+-----------+
| 長さ ll | uint | sint | float |
+===========+========+========+===========+
| 0 | uint8 | sint8 | binary16 |
+-----------+--------+--------+-----------+
| 1 | uint16 | sint16 | binary32 |
+-----------+--------+--------+-----------+
| 2 | uint32 | sint32 | binary64 |
+-----------+--------+--------+-----------+
| 3 | uint64 | sint64 | binary128 |
+-----------+--------+--------+-----------+

表 1: 長さの値

ここで、sintN はちょうど N ビットの符号付き整数 (例えば、sint16) を表し、uintN はちょうど N ビットの符号無し整数 (例えば、uint32) を表す。binaryN という名前は、IEEE 754 [IEEE754] で定義される同名の数値形式を表す。

これらのタグの目的の 1 つは、型付き配列の下層にある ArrayBuffers を、再エンコードせずに直接送ることができるようにすることであり、それらはビッグエンディアン (ネットワークバイト順) またはリトルエンディアン形式であり得る。したがって、両バリアントのタグを定義する必要がある。

合計で 24 のバリアントになる。タグ内では、整数と浮動小数点の選択、(整数の場合の) 符号性、エンディアン、および 4 つの長さ値のいずれかを表現する必要がある。

実装を簡素化するため、タグのビットからこの情報を全て取得できるような範囲のタグが割り当てられる: 64 から 87 のタグ値である。

値は、表 2 に詳細を示す 5 つのビットフィールド、すなわち 0b010, f, s, e, ll に分割される。

  +-----------+-------------------------------------------------------------+
| フィールド| 用途 |
+===========+=============================================================+
| 0b010 | 定数ビット 0, 1, 0 |
+-----------+-------------------------------------------------------------+
| f | 0: 整数, 1: 浮動小数点 |
+-----------+-------------------------------------------------------------+
| s | 0: 浮動小数点または符号無し整数, 1: 符号付き整数 |
+-----------+-------------------------------------------------------------+
| e | 0: ビッグエンディアン, 1: リトルエンディアン |
+-----------+-------------------------------------------------------------+
| ll | 長さを示す数値 (表 1) |
+-----------+-------------------------------------------------------------+

表 2: タグの下位 8 ビットのビットフィールド

各配列要素のバイト数は、"2**(f + ll)" (または一般的なプログラミング言語では "1 << (f + ll)" ) で計算できる。(0f と ll は、バイトの各 4 ビットニブルのそれぞれ 2 つの最下位ビットであることに注意せよ。)

CBOR 表現では、配列内の要素総数は明示的には表現されず、バイト文字列の長さと各表現の長さから暗黙に定まる。要素の表現を構成するバイト文字列の長さ (バイト数) から、先の式を反転することで計算できる: "bytelength >> (f + ll)"

uint8/sint8 の値では、エンディアンは冗長である。ビッグエンディアンバリアントのタグのみが使用され、そのように割り当てられる。sint8 のリトルエンディアンバリアントを示すことになるタグは使用してはならない (MUST NOT); そのタグ番号は予約 (reserved) としてマークされる。特別なケースとして、uint8 のリトルエンディアンバリアントを示すことになるタグは、代わりに、ES10 JavaScript 仕様の Section 7.1.11 (http://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp) ("ToUint8Clamp") [ECMA-ES10] でより詳細に説明される、整数からのクランプ変換を配列内の数値が使用していることを示すために割り当てられる; ここでの仮定は、復号後のこの配列のプログラム内部表現が、JavaScript の型付き配列の CBOR を介した「ラウンドトリップ」を提供する更なる処理のために、このようにマークされる、というものである。

IEEE 754 の二進浮動小数点数は常に符号付きである。したがって、float バリアント ("f" == 1) では、符号付きと符号無しのバリアントを区別する必要はない; "s" ビットは常に 0 である。"s" が 1 となるタグ番号 (タグ値 88 から 95) は、他の仕様で使用できるように空けておく。