قد يكون التعامل مع البيانات الثنائية شائكًا، لذلك توفر Gleam نوع BitArray وصيغة مرافقة لإنشاء البيانات الثنائية ومطابقة أنماطها.
تُعرَّف القيم الحرفية لمصفوفات البتات باستخدام صيغة <<>>. عند تعريف قيمة حرفية لمصفوفة بتات، تُعرَّف على شكل مقاطع. لكل مقطع قيمة وتوصيف، يفصل بينهما :. يحدد التوصيف عدد البتات التي ستُستخدم لترميز القيمة، ويمكن حذفه بالكامل، وعندها ستكون القيمة الافتراضية عددًا صحيحًا من 8 بتات.
// 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>>
تحديد النوع بالشكل :1 هو اختصار لكتابة :size(1). تحتاج إلى استخدام الصيغة الأطول إذا كان حجم البتات قادمًا من متغير.
let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>
عند كتابة قيم حرفية صحيحة ثنائية، يمكننا كتابتها مباشرة بترميز الأساس 2 عبر إضافة البادئة 0b إلى القيمة الحرفية. لاحظ أنها ستُعرض كأعداد عشرية عند طباعتها في الاختبارات أو في برنامجك.
<<0b1011:4>> == <<11:4>>
// -> True
إذا تجاوزت قيمة المقطع سعة نوع المقطع، فستُقتطع من اليسار.
<<0b1011:3>> == <<0b0011:3>>
// -> True
يمكنك الإضافة في بداية مصفوفة بتات موجودة وفي نهايتها باستخدام صيغة مصفوفة البتات. يجب استخدام التوصيف :bits لمصفوفة البتات الموجودة.
let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>
يمكننا دمج مصفوفات البتات المخزنة في متغيرات باستخدام الصيغة. يجب استخدام التوصيف :bits عند دمج مصفوفتي بتات بحجمين متغيرين.
let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>
يمكن أيضًا إجراء مطابقة الأنماط للحصول على قيم من مصفوفة البتات. عليك معرفة عدد البتات لكل جزء تريد التقاطه، مع استثناء واحد: يمكن استخدام التوصيف :bits لمطابقة الأنماط على مصفوفة بتات بحجم غير معروف، لكن هذا لا يمكن استخدامه إلا للجزء الأخير.
let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true
قد تُطبع مصفوفات البتات بتنسيق مختلف عن التنسيق الذي استُخدم لإنشائها. غالبًا ما يسبب هذا ارتباكًا عند تعلّم مصفوفات البتات.
بشكل افتراضي، تُعرض مصفوفات البتات في أجزاء من 8 بتات (بايت)، حتى لو أنشأتها بأجزاء بحجم مختلف.
<<2011:11>>
// -> <<251, 3:size(3)>>
إذا أنشأت مصفوفة بتات تمثل سلسلة نصية قابلة للطباعة مرمّزة بترميز UTF-8، فقد تُعرض كسلسلة نصية باستخدام echo keyword عند الاستهداف إلى Erlang. يعود هذا إلى تفصيل في التنفيذ يتعلق بكيفية تمثيل Gleam للسلاسل النصية داخليًا.
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"