2. CBORシーケンスフォーマット
形式的には、CBORシーケンスは、以下のいずれかとして再帰的に定義されるバイトシーケンスです。
-
空の(長さゼロの)バイトシーケンス
-
エンコードされたCBORデータ項目 [RFC7049] を構成するバイトシーケンスと、それに続くCBORシーケンス。
要するに、ゼロ個以上のエンコードされたCBORデータ項目を連結すると、CBORシーケンスが生成されます。(したがって、ゼロ個以上のCBORシーケンスを連結しても、CBORシーケンスになります。)
シーケンス終了インジケータはありません。(もし希望する場合、エンコードされているCBORデータモデル値の配列をCBORエンコードし、定長または不定長のエンコーディングを採用して単一のCBORデータ項目とすることが、実際にはより適切な表現になるかもしれません。)
CBORシーケンスは、JSONテキストシーケンス [RFC7464] とは異なり、項目間にマーカーを使用しません。これは、CBORエンコードされたデータ項目が自己区切り的であり、終了を常に計算できるために可能です。(初期のオブジェクト/配列のみの形式のJSONも自己区切り的でしたが、単一の数値などの単純な値が有効なJSONドキュメントになったときに、そうでなくなったことに注意してください。)
CBORシーケンスのデコードは次のように機能します。
-
CBORシーケンスが空のバイトシーケンスである場合、結果はCBORデータモデル値の空のシーケンスになります。
-
そうでない場合、CBORシーケンスのバイトから単一のCBORデータ項目をデコードし、残りのバイトでこのデコードプロセスを再帰的に繰り返した結果の先頭に、生成されたCBORデータモデル値を挿入する必要があります。(したがって、ストリーミングデコーダーは、ゼロ個以上のCBORデータモデル値を、それを構成するバイトが利用可能になり次第、単に配信します。)
これは、シーケンス内のデータ項目のいずれかが整形式でない場合、シーケンスの残りの部分を確実にデコードすることは不可能であることを意味します。(実装によっては、完全ではないがほぼ整形式のエンコードされたCBORデータ項目であるバイトシーケンス内のいくつかのエラーから回復できる場合があります。不正なデータの処理は、本仕様の範囲外です。)
これはまた、CBORシーケンス形式が、シーケンス内の最後のCBORデータ項目を構成するバイトの切り捨てを確実に検出できることを意味しますが、末尾の完全に欠落しているCBORデータ項目を検出することはできません。ストリーミングCBORシーケンスデータの消費に使用されるCBORシーケンスデコーダーは、切り捨てられた最後の項目が受信されている場合に備えて、単に(たとえば、一時停止してから後でデコードを再開するなどして)より多くのデータを待つことができます。