Travailler avec des données binaires peut être délicat, c'est pourquoi Gleam fournit un type BitArray et une syntaxe associée pour construire et filtrer par motif des données binaires.
Les littéraux de tableau de bits sont définis avec la syntaxe <<>>. Lorsqu'on définit un littéral de tableau de bits, celui-ci est défini en segments. Chaque segment possède une valeur et une annotation, séparées par un :. L'annotation indique combien de bits vont être utilisés pour encoder la valeur, et peut être omise complètement, auquel cas la valeur par défaut est une valeur entière de 8 bits.
// This defines a bit array with three segments of a single bit each
<<0:1, 1:1, 0:1>>
// This defines a bit array with three segments of 8 bits each
<<0, 1, 0>>
Spécifier le type avec :1 est un raccourci pour écrire :size(1). Tu dois utiliser la syntaxe longue si la taille en bits vient d'une variable.
let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>
Lorsqu'on écrit des littéraux entiers binaires, on peut les écrire directement en notation en base 2 en préfixant le littéral avec 0b. Note qu'ils seront affichés comme des nombres décimaux lorsqu'ils sont affichés dans les tests ou dans ton programme.
<<0b1011:4>> == <<11:4>>
// -> True
Si la valeur du segment dépasse la capacité du type du segment, elle sera tronquée par la gauche.
<<0b1011:3>> == <<0b0011:3>>
// -> True
Tu peux à la fois ajouter au début et à la fin d'un tableau de bits existant en utilisant la syntaxe des tableaux de bits. L'annotation :bits doit être utilisée pour le tableau de bits existant.
let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>
On peut concaténer des tableaux de bits stockés dans des variables en utilisant la syntaxe. L'annotation :bits doit être utilisée lorsqu'on concatène deux tableaux de bits de tailles variables.
let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>
Le filtrage par motif peut aussi être utilisé pour obtenir des valeurs à partir du tableau de bits. Tu dois connaître le nombre de bits pour chaque fragment que tu veux capturer, à une exception près : l'annotation :bits peut être utilisée pour filtrer par motif sur un tableau de bits de taille inconnue, mais elle ne peut être utilisée que pour le dernier fragment.
let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true
Les tableaux de bits peuvent être affichés dans un format différent de celui qui a servi à les créer. Cela prête souvent à confusion lorsqu'on apprend les tableaux de bits.
Par défaut, les tableaux de bits sont affichés en fragments de 8 bits (un octet), même si tu les as créés avec des fragments d'une taille différente.
<<2011:11>>
// -> <<251, 3:size(3)>>
Si tu crées un tableau de bits qui représente une string imprimable encodée en UTF-8, il peut être affiché comme une string en utilisant le echo keyword lorsque tu cibles Erlang. Cela est dû à un détail d'implémentation de la façon dont Gleam représente les strings en interne.
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"