Tracks
/
Gleam
Gleam
/
Lehrplan
/
Bit-Arrays
Bi

Bit-Arrays in Gleam

2 Übungen

Über Bit-Arrays

Die Arbeit mit Binärdaten kann knifflig sein, deshalb bietet Gleam den Typ BitArray und eine passende Syntax, um Binärdaten zu konstruieren und per Musterabgleich darauf zuzugreifen.

Bit-Array-Literale werden mit der Syntax <<>> definiert. Wenn du ein Bit-Array-Literal definierst, definierst du es in Segmenten. Jedes Segment hat einen Wert und eine Annotation, getrennt durch ein :. Die Annotation gibt an, wie viele Bits zur Kodierung des Werts verwendet werden. Du kannst sie auch ganz weglassen, dann wird standardmäßig eine 8-Bit-Ganzzahl verwendet.

// 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>>

Die Angabe :1 ist eine Kurzform für :size(1). Du musst die längere Syntax verwenden, wenn die Bitgröße aus einer Variable kommt.

let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>

Binär

Wenn wir binäre Ganzzahl-Literale schreiben, können wir sie direkt in der Basis-2-Notation angeben, indem wir dem Literal ein 0b voranstellen. Beachte, dass sie als Dezimalzahlen angezeigt werden, wenn sie in Tests oder in deinem Programm ausgegeben werden.

<<0b1011:4>> == <<11:4>>
// -> True

Abschneiden

Wenn der Wert des Segments die Kapazität des Segmenttyps überschreitet, wird er von links abgeschnitten.

<<0b1011:3>> == <<0b0011:3>>
// -> True

Voranstellen und Anhängen

Du kannst einem vorhandenen Bit-Array sowohl etwas voranstellen als auch etwas anhängen, und zwar mit der Bit-Array-Syntax. Für das vorhandene Bit-Array musst du die Annotation :bits verwenden.

let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>

Verketten

Wir können Bit-Arrays, die in Variablen gespeichert sind, mit dieser Syntax verketten. Die Annotation :bits musst du verwenden, wenn du zwei Bit-Arrays mit variabler Größe verkettest.

let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>

Musterabgleich

Mit Musterabgleich kannst du auch Werte aus dem Bit-Array herauslesen. Für jedes Fragment, das du erfassen möchtest, musst du die Anzahl der Bits kennen. Es gibt eine Ausnahme: Mit der Annotation :bits kannst du einen Musterabgleich auf einem Bit-Array unbekannter Größe durchführen, aber das geht nur für das letzte Fragment.

let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true

Bit-Arrays untersuchen

Note

Bit-Arrays werden möglicherweise in einem anderen Format ausgegeben als dem, mit dem sie erstellt wurden. Das führt beim Lernen von Bit-Arrays oft zu Verwirrung.

Standardmäßig werden Bit-Arrays in Fragmenten von 8 Bits (einem Byte) angezeigt, auch wenn du sie mit Fragmenten einer anderen Größe erstellt hast.

<<2011:11>>
// -> <<251, 3:size(3)>>

Wenn du ein Bit-Array erstellst, das einen druckbaren UTF-8-kodierten String darstellt, kann es als String angezeigt werden, indem du das echo keyword verwendest, wenn du als Ziel Erlang verwendest. Das liegt an einem Implementierungsdetail, wie Gleam Strings intern darstellt.

<<>>
// -> ""

<<65, 66, 67>>
// -> "ABC"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Bit-Arrays