2. Tableaux typés
2. Tableaux typés
Les tableaux typés sont des tableaux homogènes de nombres, dont tous les éléments sont encodés selon une seule forme de représentation binaire. La concaténation de ces représentations est encodée comme une seule chaîne d'octets CBOR (major type 2), entourée par une seule étiquette indiquant le type et l'encodage de tous les nombres représentés dans la chaîne d'octets.
2.1 Types de nombres
Trois classes de nombres sont d'intérêt : les entiers non signés (uint), les entiers signés (complément à deux, sint), et les nombres flottants binaires IEEE 754 (qui sont toujours signés). Pour chacune de ces classes, plusieurs longueurs de représentation sont utilisées :
+-----------+--------+--------+-----------+
| 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
Ici, sintN représente un entier signé de exactement N bits (par exemple, sint16), et uintN représente un entier non signé de exactement N bits (par exemple, uint32). Le nom binaryN représente la forme de nombre du même nom définie dans IEEE 754 [IEEE754].
Puisque l'un des objectifs de ces étiquettes est de pouvoir transporter directement les ArrayBuffers sous-jacents aux tableaux typés sans les ré-encoder, et que ceux-ci peuvent être soit en big-endian (ordre des octets réseau) soit en little-endian, il est nécessaire de définir des étiquettes pour les deux variantes.
Au total, cela conduit à 24 variantes. Dans l'étiquette, il faut exprimer le choix entre entier et flottant, la signature (pour les entiers), l'endianité, et l'une des quatre valeurs de longueur.
Afin de simplifier l'implémentation, une plage d'étiquettes est allouée qui permet de récupérer toutes ces informations à partir des bits de l'étiquette : des valeurs d'étiquette de 64 à 87.
La valeur est divisée en 5 champs de bits : 0b010, f, s, e, et ll, comme détaillé dans la Table 2.
+-------+-------------------------------------------------------+
| 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
Le nombre d'octets dans chaque élément de tableau peut alors être calculé par "2**(f + ll)" (ou "1 << (f + ll)" dans un langage de programmation typique). (Notez que 0f et ll sont, respectivement, les deux bits de poids faible de chaque nibble de 4 bits dans l'octet.)
Dans la représentation CBOR, le nombre total d'éléments dans le tableau n'est pas exprimé explicitement mais est implicite à partir de la longueur de la chaîne d'octets et de la longueur de chaque représentation. Il peut être calculé à partir de la longueur, en octets, de la chaîne d'octets constituant la représentation du tableau en inversant la formule précédente : "bytelength >> (f + ll)".
Pour les valeurs uint8/sint8, l'endianité est redondante. Seule l'étiquette pour la variante big-endian est utilisée et affectée comme telle. L'étiquette qui signifierait la variante little-endian de sint8 MUST NOT être utilisée ; son numéro d'étiquette est marqué comme réservé. Comme cas particulier, l'étiquette qui signifierait la variante little-endian de uint8 est à la place affectée pour signifier que les nombres du tableau utilisent une conversion avec saturation (clamped) à partir d'entiers, comme décrit plus en détail dans la Section 7.1.11 (http://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp) de la spécification JavaScript ES10 ("ToUint8Clamp") [ECMA-ES10] ; l'hypothèse est qu'une représentation interne du programme de ce tableau après décodage serait marquée de cette manière pour un traitement ultérieur permettant le "roundtripping" des tableaux typés JavaScript via CBOR.
Les nombres flottants binaires IEEE 754 sont toujours signés. Par conséquent, pour les variantes flottantes ("f" == 1), il n'est pas nécessaire de distinguer entre variantes signées et non signées ; le bit "s" est toujours à zéro. Les numéros d'étiquette où "s" serait à un (ce qui correspondrait à des valeurs d'étiquette de 88 à 95) restent libres pour être utilisés par d'autres spécifications.