3. Tag di array aggiuntivi
3. Tag di array aggiuntivi
Questa specifica definisce tre tag di array aggiuntivi. I tag per array multidimensionali possono essere combinati con array CBOR classici così come con array tipizzati per costruire array multidimensionali con un numero costante di elementi nei sotto-array. Il tag per array omogenei può essere usato come segnale da un’applicazione per identificare un array CBOR classico come array omogeneo, anche quando un array tipizzato non si applica.
3.1 Array multidimensionale
Un array multidimensionale è rappresentato come un array taggato che contiene due array (unidimensionali). Il primo array definisce le dimensioni dell’array multidimensionale (nella sequenza dalle dimensioni più esterne verso quelle più interne), mentre il secondo array rappresenta il contenuto dell’array multidimensionale. Se il secondo array è a sua volta taggato come array tipizzato, allora il tipo degli elementi dell’array multidimensionale è noto essere lo stesso tipo dell’array tipizzato.
Questo documento definisce due tag: uno per elementi disposti in ordine row-major e un altro per ordine column-major [RowColMajor].
3.1.1 Ordine row-major
Tag: 40
Elemento dati: Array (tipo principale 4) di due array: un array (tipo principale 4) di dimensioni, che sono interi senza segno diversi da zero; e un array (uno tra un array CBOR di tipo principale 4, un array tipizzato o un array omogeneo) di elementi.
I dati nel secondo array consistono in valori consecutivi in cui l’ultima dimensione è considerata contigua (ordine row-major).
La Figura 1 mostra una dichiarazione di un array bidimensionale nel linguaggio C e una rappresentazione in CBOR che usa sia un tag per array multidimensionale sia un tag per array tipizzato.
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
La Figura 2 mostra lo stesso array bidimensionale usando il tag per array multidimensionale in combinazione con un array CBOR di base (che, con i numeri piccoli scelti per l’esempio, risulta essere più corto).
<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 Ordine column-major
Gli array multidimensionali specificati nel sottoparagrafo precedente sono in ordine "row major", che è l’ordine preferito ai fini di questa specifica. In questo sottoparagrafo viene fornita una rappresentazione analoga che usa array in ordine "column major" con il tag 1040, come illustrato nella Figura 3.
Tag: 1040
Elemento dati: Come il tag 40, eccetto che i dati nel secondo array consistono in valori consecutivi in cui la prima dimensione è considerata contigua (ordine column-major).
<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 Array omogeneo
Tag: 41
Elemento dati: Array (tipo principale 4)
Questo tag identifica l’array CBOR classico (un array unidimensionale) taggato da esso come array omogeneo, cioè ha elementi che sono tutti dello stesso tipo del modello dati dell’applicazione. Il tipo degli elementi dell’array è quindi determinato dal tipo del modello dati dell’applicazione del primo elemento dell’array.
Questo può essere usato in modelli dati applicativi che applicano semantiche specifiche agli array omogenei. Inoltre, in alcuni casi, implementazioni in linguaggi fortemente tipizzati potrebbero essere in grado di creare array omogenei nativi di tipi specifici invece di liste ordinate durante la decodifica. Quali elementi dati CBOR costituiscano elementi dello stesso tipo applicativo dipende dall’applicazione.
La Figura 4 mostra un esempio di array omogeneo di booleani in C++ [CPlusPlus] e 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
La Figura 5 estende l’esempio con una struttura più complessa.
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