3. Étiquettes de tableau supplémentaires
3. Étiquettes de tableau supplémentaires
Cette spécification définit trois étiquettes de tableau supplémentaires. Les étiquettes de tableau multi-dimensionnel peuvent être combinées avec des tableaux CBOR classiques ainsi qu'avec des tableaux typés afin de construire des tableaux multi-dimensionnels avec un nombre constant d'éléments dans les sous-tableaux. L'étiquette de tableau homogène peut être utilisée comme signal par une application pour identifier un tableau CBOR classique comme un tableau homogène, même lorsqu'un tableau typé ne s'applique pas.
3.1 Tableau multi-dimensionnel
Un tableau multi-dimensionnel est représenté comme un tableau étiqueté qui contient deux tableaux (unidimensionnels). Le premier tableau définit les dimensions du tableau multi-dimensionnel (dans la séquence des dimensions externes vers les dimensions internes) tandis que le second tableau représente le contenu du tableau multi-dimensionnel. Si le second tableau est lui-même étiqueté comme un tableau typé, alors le type d'élément du tableau multi-dimensionnel est connu comme étant le même type que celui du tableau typé.
Deux étiquettes sont définies par ce document : l'une pour des éléments arrangés en ordre row-major et l'autre en ordre column-major [RowColMajor].
3.1.1 Ordre row-major
Tag: 40
Data Item: Array (major type 4) of two arrays: one array (major type 4) of dimensions, which are unsigned integers distinct from zero; and one array (any one of a CBOR array of major type 4, a Typed Array, or a Homogeneous Array) of elements.
Data in the second array consists of consecutive values where the last dimension is considered contiguous (row-major order).
Figure 1 shows a declaration of a two-dimensional array in the C language, a representation of that in CBOR using both a multi-dimensional array tag and a typed array tag.
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
Figure 2 shows the same two-dimensional array using the multi-dimensional array tag in conjunction with a basic CBOR array (which, with the small numbers chosen for the example, happens to be shorter).
<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 Ordre column-major
Les tableaux multi-dimensionnels spécifiés dans la sous-sous-section précédente sont en ordre "row major", qui est l'ordre préféré pour les besoins de cette spécification. Une représentation analogue qui utilise des tableaux en ordre "column major" est fournie dans cette sous-section sous l'étiquette 1040, comme illustré dans la Figure 3.
Tag: 1040
Data Item: The same as tag 40, except the data in the second array consists of consecutive values where the first dimension is considered contiguous (column-major order).
<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 Tableau homogène
Tag: 41
Data Item: Array (major type 4)
Cette étiquette identifie le tableau CBOR classique (un tableau unidimensionnel) étiqueté par elle comme un tableau homogène, c'est-à-dire qu'il a des éléments qui sont tous du même type de données du modèle d'application. Le type d'élément du tableau est donc déterminé par le type de données du modèle d'application du premier élément du tableau.
Cela peut être utilisé dans des modèles de données d'application qui appliquent une sémantique spécifique aux tableaux homogènes. Aussi, dans certains cas, des implémentations dans des langages fortement typés peuvent être capables de créer des tableaux homogènes natifs de types spécifiques au lieu de listes ordonnées lors du décodage. Les éléments CBOR qui constituent des éléments du même type d'application sont spécifiques à l'application.
Figure 4 shows an example for a homogeneous array of booleans in C++ [CPlusPlus] and 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
Figure 5 extends the example with a more complex structure.
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