2. Typisierte Arrays
2. Typisierte Arrays
Typisierte Arrays sind homogene Arrays aus Zahlen, die alle in einer einzigen Form binärer Darstellung kodiert sind. Die Verkettung dieser Darstellungen wird als eine einzelne CBOR-Byte-String (Haupttyp 2) kodiert und von einem einzelnen Tag umschlossen, der Typ und Kodierung aller in diesem Byte-String dargestellten Zahlen angibt.
2.1 Zahlentypen
Drei Klassen von Zahlen sind von Interesse: vorzeichenlose Ganzzahlen (uint), vorzeichenbehaftete Ganzzahlen (Zweierkomplement, sint) und IEEE-754-binäres Gleitkomma (immer vorzeichenbehaftet). Für jede dieser Klassen sind mehrere Darstellungslängen in aktiver Verwendung:
+-----------+--------+--------+-----------+
| Length ll | uint | sint | float |
+===========+========+========+===========+
| 0 | uint8 | sint8 | binary16 |
+-----------+--------+--------+-----------+
| 1 | uint16 | sint16 | binary32 |
+-----------+--------+--------+-----------+
| 2 | uint32 | sint32 | binary64 |
+-----------+--------+--------+-----------+
| 3 | uint64 | sint64 | binary128 |
+-----------+--------+--------+-----------+
Table 1: Length Values
Hier steht sintN für eine vorzeichenbehaftete Ganzzahl mit genau N Bits (z. B. sint16), und uintN für eine vorzeichenlose Ganzzahl mit genau N Bits (z. B. uint32). Der Name binaryN steht für die gleichnamige Zahlenform aus IEEE 754 [IEEE754].
Da ein Ziel dieser Tags darin besteht, ArrayBuffers, die den typisierten Arrays zugrunde liegen, direkt zu übertragen, ohne sie neu zu kodieren, und diese entweder in Big-Endian- (Netzwerk-Byte-Reihenfolge) oder in Little-Endian-Form vorliegen können, müssen Tags für beide Varianten definiert werden.
Insgesamt führt dies zu 24 Varianten. Im Tag müssen die Wahl zwischen Ganzzahl und Gleitkomma, die Vorzeichenbehandlung (für Ganzzahlen), die Endianness sowie einer der vier Längenwerte ausgedrückt werden.
Um die Implementierung zu vereinfachen, wird ein Bereich von Tags zugewiesen, der es erlaubt, all diese Informationen aus den Bits des Tags abzuleiten: Tag-Werte von 64 bis 87.
Der Wert wird in fünf Bitfelder aufgeteilt: 0b010, f, s, e und ll, wie in Tabelle 2 beschrieben.
+-------+-------------------------------------------------------+
| Field | Use |
+=======+=======================================================+
| 0b010 | the constant bits 0, 1, 0 |
+-------+-------------------------------------------------------+
| f | 0 for integer, 1 for float |
+-------+-------------------------------------------------------+
| s | 0 for float or unsigned integer, 1 for signed integer |
+-------+-------------------------------------------------------+
| e | 0 for big endian, 1 for little endian |
+-------+-------------------------------------------------------+
| ll | A number for the length (Table 1). |
+-------+-------------------------------------------------------+
Table 2: Bit Fields in the Low 8 Bits of the Tag
Die Anzahl der Bytes pro Array-Element kann dann als "2**(f + ll)" berechnet werden (oder "1 << (f + ll)" in einer typischen Programmiersprache). (Beachten Sie, dass f und ll jeweils die zwei niederwertigsten Bits jedes 4-Bit-Nibbles im Byte sind.)
In der CBOR-Darstellung wird die Gesamtzahl der Elemente im Array nicht explizit angegeben, sondern aus der Länge des Byte-Strings und der Länge jeder Darstellung abgeleitet. Sie kann aus der Länge (in Bytes) des Byte-Strings, der die Array-Darstellung enthält, berechnet werden, indem die vorherige Formel invertiert wird: "bytelength >> (f + ll)".
Für uint8/sint8 ist die Endianness redundant. Es wird nur der Tag für die Big-Endian-Variante verwendet und entsprechend zugewiesen. Der Tag, der die Little-Endian-Variante von sint8 kennzeichnen würde, MUST NOT verwendet werden; seine Tag-Nummer ist als reserviert markiert. Als Sonderfall wird der Tag, der die Little-Endian-Variante von uint8 kennzeichnen würde, stattdessen zugewiesen, um anzuzeigen, dass die Zahlen im Array eine „clamped conversion“ aus Ganzzahlen verwenden, wie in Abschnitt 7.1.11 (http://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp) der ES10-JavaScript-Spezifikation ("ToUint8Clamp") [ECMA-ES10] beschrieben; die Annahme ist hier, dass eine interne Programmrepräsentation dieses Arrays nach dem Dekodieren für eine weitere Verarbeitung entsprechend markiert wäre, um ein „Roundtripping“ von JavaScript-typisierten Arrays durch CBOR zu ermöglichen.
IEEE-754-binäres Gleitkomma ist immer vorzeichenbehaftet. Daher gibt es für die Float-Varianten ("f" == 1) keine Notwendigkeit, zwischen vorzeichenbehafteten und vorzeichenlosen Varianten zu unterscheiden; das "s"-Bit ist immer null. Die Tag-Nummern, bei denen "s" eins wäre (was Tag-Werte 88 bis 95 ergäbe), bleiben frei für die Verwendung durch andere Spezifikationen.