Zum Hauptinhalt springen

3. Zusätzliche Array-Tags

3. Zusätzliche Array-Tags

Diese Spezifikation definiert drei zusätzliche Array-Tags. Die Tags für mehrdimensionale Arrays können sowohl mit klassischen CBOR-Arrays als auch mit typisierten Arrays kombiniert werden, um mehrdimensionale Arrays mit konstanten Elementanzahlen in den Unterarrays aufzubauen. Der Tag für homogene Arrays kann von einer Anwendung als Signal genutzt werden, um ein klassisches CBOR-Array als homogenes Array zu kennzeichnen, selbst wenn ein typisiertes Array nicht anwendbar ist.

3.1 Mehrdimensionales Array

Ein mehrdimensionales Array wird als getaggtes Array dargestellt, das zwei (eindimensionale) Arrays enthält. Das erste Array definiert die Dimensionen des mehrdimensionalen Arrays (in der Reihenfolge von äußeren zu inneren Dimensionen), während das zweite Array den Inhalt des mehrdimensionalen Arrays darstellt. Wenn das zweite Array selbst als typisiertes Array getaggt ist, ist der Elementtyp des mehrdimensionalen Arrays derselbe wie der des typisierten Arrays.

Dieses Dokument definiert zwei Tags: einen für Elemente in Zeilenmajor-Reihenfolge und einen für Spaltenmajor-Reihenfolge [RowColMajor].

3.1.1 Zeilenmajor-Reihenfolge

Tag: 40

Datenobjekt: Array (Haupttyp 4) aus zwei Arrays: ein Array (Haupttyp 4) mit Dimensionen, die vorzeichenlose Ganzzahlen ungleich null sind; und ein Array (entweder ein CBOR-Array vom Haupttyp 4, ein typisiertes Array oder ein homogenes Array) mit Elementen.

Die Daten im zweiten Array bestehen aus aufeinanderfolgenden Werten, wobei die letzte Dimension als zusammenhängend betrachtet wird (row-major order).

Abbildung 1 zeigt eine Deklaration eines zweidimensionalen Arrays in der Sprache C sowie eine Darstellung in CBOR unter Verwendung sowohl eines Tags für mehrdimensionale Arrays als auch eines Tags für typisierte Arrays.

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

Abbildung 2 zeigt dasselbe zweidimensionale Array unter Verwendung des Tags für mehrdimensionale Arrays in Verbindung mit einem grundlegenden CBOR-Array (was bei den für das Beispiel gewählten kleinen Zahlen zufällig kürzer ist).

<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 Spaltenmajor-Reihenfolge

Die im vorherigen Unterabschnitt spezifizierten mehrdimensionalen Arrays sind in „row major“-Reihenfolge, welche für die Zwecke dieser Spezifikation die bevorzugte Reihenfolge ist. Eine analoge Darstellung, die „column major“-Reihenfolge verwendet, wird in diesem Unterabschnitt unter Tag 1040 bereitgestellt, wie in Abbildung 3 dargestellt.

Tag: 1040

Datenobjekt: Wie bei Tag 40, außer dass die Daten im zweiten Array aus aufeinanderfolgenden Werten bestehen, wobei die erste Dimension als zusammenhängend betrachtet wird (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 Homogenes Array

Tag: 41

Datenobjekt: Array (Haupttyp 4)

Dieser Tag kennzeichnet das klassische CBOR-Array (ein eindimensionales Array), das von ihm getaggt wird, als homogenes Array, d. h. es hat Elemente, die alle denselben Anwendungsmittel-Datentyp besitzen. Der Elementtyp des Arrays wird daher durch den Anwendungsdatenmodelltyp des ersten Array-Elements bestimmt.

Dies kann in Anwendungsdatenmodellen verwendet werden, die homogenen Arrays spezifische Semantik zuweisen. Außerdem können Implementierungen in stark typisierten Sprachen in bestimmten Fällen beim Dekodieren native homogene Arrays spezifischer Typen erzeugen, statt geordnete Listen. Welche CBOR-Datenobjekte Elemente desselben Anwendungstyps darstellen, ist anwendungsspezifisch.

Abbildung 4 zeigt ein Beispiel für ein homogenes Array von Booleans in C++ [CPlusPlus] und 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

Abbildung 5 erweitert das Beispiel um eine komplexere Struktur.

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