跳到主要内容

2. CBOR Sequence 格式 (CBOR Sequence Format)

形式上, CBOR Sequence 是一个字节 sequence, 递归定义为以下两者之一:

  • 空的 (长度为零的) 字节 sequence

  • 构成一个已编码 CBOR data item [RFC7049] 的字节 sequence, 后接一个 CBOR Sequence.

简而言之, 拼接零个或多个已编码的 CBOR data item 会生成一个 CBOR Sequence. 因此, 拼接零个或多个 CBOR Sequence 也会得到一个 CBOR Sequence.

不存在 end-of-sequence 指示符. 如果需要这样的指示符, 更合适的表示方式实际上可能是: 将正在编码的 CBOR 数据模型值组成数组, 采用确定长度或不定长度编码, 并将该数组作为单个 CBOR data item 进行 CBOR 编码.

CBOR Sequences 与 JSON Text Sequences [RFC7464] 不同, 不在 item 之间使用标记. 这是可行的, 因为 CBOR 编码的 data item 是自定界的, 其结束位置总是可以计算出来. 请注意, 早期仅包含 object/array 的 JSON 形式同样是自定界的, 但在单个数字等简单值也被允许作为有效 JSON 文档之后, 这一点就不再成立.

CBOR Sequence 的解码方式如下:

  • 如果 CBOR Sequence 是空的字节 sequence, 结果就是空的 CBOR 数据模型值 sequence.

  • 否则, 必须从 CBOR Sequence 的字节中解码出单个 CBOR data item, 并将得到的 CBOR 数据模型值插入到结果开头; 该结果是用剩余字节递归重复这一解码过程所得到的结果. 因此, 流式解码器只需交付零个或多个 CBOR 数据模型值, 并在构成每个值的字节可用后立即交付该值.

这意味着, 如果 sequence 中的任何 data item 不是良构的, 就无法可靠地解码该 sequence 的其余部分. 某个实现或许能够从一个几乎但并非完全良构的已编码 CBOR data item 字节 sequence 中的某些错误恢复. 处理畸形数据不在本规范范围内.

这也意味着, CBOR Sequence 格式能够可靠地检测出构成 sequence 中最后一个 CBOR data item 的字节被截断的情况, 但无法检测末尾完全缺失的 CBOR data item. 用于消费流式 CBOR Sequence 数据的 CBOR Sequence 解码器, 在收到被截断的最终 item 时, 可以直接暂停以等待更多数据, 例如挂起解码并在之后恢复.