A bináris adatokkal való munka trükkös lehet, ezért a Gleam biztosít egy BitArray típust és a hozzá tartozó szintaxist, amellyel bináris adatokat hozhatsz létre, illetve illeszthetsz rájuk mintát.
A bittömb-literálokat a <<>> szintaxissal hozod létre. Amikor egy bittömb-literált létrehozol, az szegmensekből épül fel. Minden szegmens egy értékből és egy annotációból áll, amelyeket egy : választ el. Az annotáció megadja, hogy hány bitet használunk az érték kódolásához, és teljesen el is hagyható; ilyenkor alapértelmezés szerint 8 bites egész értéket kapunk.
// 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>>
Ha a típust :1-ként adod meg, az a :size(1) rövidített alakja. A hosszabb szintaxist kell használnod, ha a bitméret egy változóból származik.
let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>
A bináris egész literálokat közvetlenül kettes számrendszerben is leírhatod, ha a literál elé 0b-t teszel. Ne feledd, hogy amikor a tesztekben vagy a programodban kiíródnak, tízes számrendszerbeli számként jelennek meg.
<<0b1011:4>> == <<11:4>>
// -> True
Ha a szegmens értéke meghaladja a szegmens típusának kapacitását, akkor az érték balról csonkul.
<<0b1011:3>> == <<0b0011:3>>
// -> True
A bittömb-szintaxissal a meglévő bittömb elé és mögé is fűzhetsz. A meglévő bittömbnél a :bits annotációt kell használnod.
let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>
A változókban tárolt bittömböket ezzel a szintaxissal fűzheted össze. Két, változó méretű bittömb összefűzésekor a :bits annotációt kell használnod.
let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>
Mintaillesztéssel értékeket is kinyerhetsz a bittömbből. Ismerned kell az egyes elkapni kívánt darabok bitméretét, egyetlen kivétellel: ismeretlen méretű bittömbre a :bits annotációval is illeszthetsz mintát, de ezt csak az utolsó darabnál használhatod.
let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true
Előfordulhat, hogy a bittömbök más formátumban jelennek meg, mint amilyenben létrehoztad őket. Ez a bittömbök tanulása közben gyakran okoz zavart.
Alapértelmezés szerint a bittömbök 8 bites darabokban (egy bájtban) jelennek meg, még akkor is, ha más méretű darabokkal hoztad létre őket.
<<2011:11>>
// -> <<251, 3:size(3)>>
Ha olyan bittömböt hozol létre, amely egy nyomtatható, UTF-8-kódolású stringet reprezentál, akkor Erlang célnyelven a echo keyword használatával stringként is megjelenhet. Ennek oka a Gleam belső string-ábrázolásának egyik megvalósítási részlete.
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"