Aller au contenu principal

2. Format de séquence CBOR

Formellement, une séquence CBOR est une séquence d'octets qui est définie récursivement comme étant l'une des suivantes :

  • une séquence d'octets vide (de longueur zéro)

  • la séquence d'octets constituant un élément de données CBOR encodé [RFC7049] suivi d'une séquence CBOR.

En bref, la concaténation de zéro ou plusieurs éléments de données CBOR encodés génère une séquence CBOR. (Par conséquent, la concaténation de zéro ou plusieurs séquences CBOR donne également une séquence CBOR.)

Il n'y a pas d'indicateur de fin de séquence. (Si l'on en souhaite un, l'encodage CBOR d'un tableau des valeurs du modèle de données CBOR en cours d'encodage, en utilisant un encodage de longueur définie ou indéfinie, en tant qu'élément de données CBOR unique peut en fait être la représentation la plus appropriée.)

Les séquences CBOR, contrairement aux séquences de texte JSON [RFC7464], n'utilisent pas de marqueur entre les éléments. Cela est possible car les éléments de données encodés en CBOR sont auto-délimités et la fin peut toujours être calculée. (Notez que, bien que la forme initiale de JSON uniquement objet/tableau était également auto-délimitée, cela a cessé d'être le cas lorsque des valeurs simples telles que des nombres uniques sont devenues des documents JSON valides.)

Le décodage d'une séquence CBOR fonctionne comme suit :

  • Si la séquence CBOR est une séquence d'octets vide, le résultat est une séquence vide de valeurs de modèle de données CBOR.

  • Sinon, il faut décoder un seul élément de données CBOR à partir des octets de la séquence CBOR et insérer la valeur de modèle de données CBOR résultante au début du résultat de la répétition récursive de ce processus de décodage avec les octets restants. (Un décodeur en continu livrerait donc simplement zéro ou plusieurs valeurs de modèle de données CBOR, chacune dès que les octets qui la composent sont disponibles.)

Cela signifie que si un élément de données de la séquence n'est pas bien formé, il n'est pas possible de décoder de manière fiable le reste de la séquence. (Une implémentation peut être capable de récupérer de certaines erreurs dans une séquence d'octets qui est presque, mais pas entièrement, un élément de données CBOR encodé bien formé. La gestion des données mal formées ne relève pas du champ d'application de cette spécification.)

Cela signifie également que le format de séquence CBOR peut détecter de manière fiable la troncature des octets constituant le dernier élément de données CBOR de la séquence, mais il ne peut pas détecter les éléments de données CBOR entièrement manquants à la fin. Un décodeur de séquence CBOR utilisé pour consommer des données de séquence CBOR en continu peut simplement attendre plus de données (par exemple, en suspendant et en reprenant ultérieurement le décodage) au cas où un élément final tronqué serait reçu.