跳到主要内容

3. 附加数组标签

3. 附加数组标签

本规范定义了三个附加数组标签. 多维数组标签可以与经典 CBOR 数组以及类型化数组结合使用, 以构建子数组中元素数量恒定的多维数组. 即使类型化数组不适用, 应用也可以使用同构数组标签作为信号, 将经典 CBOR 数组标识为同构数组.

3.1 多维数组

多维数组表示为一个带标签数组, 其中包含两个 (一维) 数组. 第一个数组定义多维数组的维度 (按从外层维度到内层维度的顺序), 第二个数组表示多维数组的内容. 如果第二个数组本身被标记为类型化数组, 则可知多维数组的元素类型与该类型化数组的类型相同.

本文档定义两个标签: 一个用于按行优先顺序排列的元素, 另一个用于按列优先顺序排列的元素 [RowColMajor].

3.1.1 行优先顺序

Tag: 40

Data Item: 由两个数组组成的数组 (major type 4): 一个维度数组 (major type 4), 其中维度为非零无符号整数; 以及一个元素数组 (可以是 major type 4 的 CBOR 数组、类型化数组或同构数组).

第二个数组中的数据由连续值组成, 其中最后一个维度被视为连续 (行优先顺序).

图 1 展示了 C 语言中二维数组的声明, 以及同时使用多维数组标签和类型化数组标签的 CBOR 表示.

uint16_t a[2][3] = {
{2, 4, 8}, /* row 0 */
{4, 16, 256},
};

<Tag 40> # multi-dimensional array tag
82 # array(2)
82 # array(2)
02 # unsigned(2) 1st Dimension
03 # unsigned(3) 2nd Dimension
<Tag 65> # uint16 array
4c # byte string(12)
0002 # unsigned(2)
0004 # unsigned(4)
0008 # unsigned(8)
0004 # unsigned(4)
0010 # unsigned(16)
0100 # unsigned(256)

Figure 1: Multi-dimensional Array in C and CBOR

图 2 展示了同一个二维数组, 其中多维数组标签与基本 CBOR 数组结合使用 (在该示例所选小数字下恰好更短).

<Tag 40> # multi-dimensional array tag
82 # array(2)
82 # array(2)
02 # unsigned(2) 1st Dimension
03 # unsigned(3) 2nd Dimension
86 # array(6)
02 # unsigned(2)
04 # unsigned(4)
08 # unsigned(8)
04 # unsigned(4)
10 # unsigned(16)
19 0100 # unsigned(256)

Figure 2: Multi-dimensional Array Using Basic CBOR Array

3.1.2 列优先顺序

前一小节指定的多维数组采用 "row major" 顺序, 这是本规范目的下的首选顺序. 本小节在标签 1040 下提供使用 "column major" 顺序数组的类似表示, 如图 3 所示.

Tag: 1040

Data Item: 与标签 40 相同, 但第二个数组中的数据由连续值组成, 其中第一个维度被视为连续 (列优先顺序).

<Tag 1040> # multi-dimensional array tag, column-major order
82 # array(2)
82 # array(2)
02 # unsigned(2) 1st Dimension
03 # unsigned(3) 2nd Dimension
86 # array(6)
02 # unsigned(2)
04 # unsigned(4)
04 # unsigned(4)
10 # unsigned(16)
08 # unsigned(8)
19 0100 # unsigned(256)

Figure 3: Multi-dimensional Array Using Basic CBOR Array, Column-
Major Order

3.2 同构数组

Tag: 41

Data Item: Array (major type 4)

该标签将其所标记的经典 CBOR 数组 (一维数组) 标识为同构数组, 即其所有元素都具有相同的应用模型数据类型. 因此, 数组的元素类型由第一个数组元素的应用模型数据类型确定.

这可用于那些对同构数组应用特定语义的应用数据模型. 此外, 在某些情况下, 强类型语言中的实现可在解码时创建特定类型的原生同构数组, 而不是有序列表. 哪些 CBOR 数据项构成同一应用类型的元素取决于具体应用.

图 4 展示了 C++ [CPlusPlus] 和 CBOR 中布尔值同构数组的示例.

bool boolArray[2] = { true, false };

<Tag 41> # Homogeneous Array Tag
82 #array(2)
F5 # true
F4 # false

Figure 4: Homogeneous Array in C++ and CBOR

图 5 用更复杂的结构扩展了该示例.

typedef struct {
bool active;
int value;
} foo;
foo myArray[2] = { {true, 3}, {true, -4} };

<Tag 41>
82 # array(2)
82 # array(2)
F5 # true
03 # 3
82 # array(2)
F5 # true
23 # -4

Figure 5: Homogeneous Array in C++ and CBOR