Topik ini menuntaskan bit syntax, sintaks khas Erlang untuk menyusun dan mengurai data biner bit demi bit: segmen dengan ukuran dan tipe, urutan byte, bilangan bertanda, serta bitstring yang panjangnya bukan kelipatan byte. Inilah alasan penguraian protokol jaringan pada Erlang terasa seperti membaca spesifikasinya langsung.
Segmen dan ukuran#
Binary disusun dengan daftar segmen di antara << dan >>, dan tiap segmen dapat menyatakan ukurannya dalam bit setelah tanda titik dua. Ukuran bawaan segmen adalah 8 bit, sehingga <<1, 2>> sama dengan <<1:8, 2:8>>. Sesi berikut menunjukkan ukuran, batas byte, dan pemecahan nilai:
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> <<5>>.
<<5>>
2> <<256>>.
<<0>>
3> <<X:16>> = <<1, 2>>.
<<1,2>>
4> X.
258
5> <<A:3, B:5>> = <<197>>.
<<"Å">>
6> A.
6
7> B.
5Baris kedua memperlihatkan batas tegas segmen tanpa spesifikasi: nilai 256 meluber dari 8 bit dan dipotong menjadi 0 tanpa error, sehingga ukuran yang disebut harus sesuai rentang nilai. Baris ketiga membaca dua byte sebagai satu bilangan 16-bit bernilai 258, dan baris kelima memecah satu byte menjadi dua bagian, 3 bit bernilai 6 dan 5 bit bernilai 5, persis seperti mengikuti urutan bidang pada spesifikasi protokol.
Tipe dan arah byte#
Segmen dapat menyatakan tipe dan arah byte setelah garis miring: integer, float, binary, atau bitstring untuk tipe, signed atau unsigned untuk tanda, serta big, little, atau native untuk urutan byte. Kombinasi inilah yang membuat bit syntax bisa membaca format dari mesin mana pun:
8> <<I:32/little-unsigned-integer>> = <<1, 0, 0, 0>>.
<<1,0,0,0>>
9> I.
1
10> <<Tanda:1/signed, Data:7>> = <<197>>.
<<"Å">>
11> Tanda.
-1
12> Data.
69Baris pertama membaca empat byte sebagai bilangan 32-bit urutan little-endian dan menghasilkan 1, kebalikan dari bacaan big-endian yang akan menghasilkan 16777216. Baris ketiga memecah byte 197 yang sama di atas menjadi 1 bit bertanda dan 7 bit sisa, dan hasilnya -1 dan 69, karena bit tertinggi yang sebelumnya terhitung sebagai bagian dari 6 kini menandai tanda. Satu byte yang sama, tiga pembacaan berbeda: itulah inti bit syntax.
Segmen float dan arah native#
Selain integer, segmen dapat menyimpan float dengan ukuran 64 atau 32 bit, dan arah native mengikuti arah byte mesin yang menjalankan VM:
1> <<F:64/float>> = <<63, 240, 0, 0, 0, 0, 0, 0>>.
<<63,240,0,0,0,0,0,0>>
2> F.
1.0Delapan byte dari protokol eksternal yang diketahui bertipe double dibaca menjadi float 1.0 dalam satu segmen, tanpa perhitungan manual. Arah big adalah bawaan dan menjadi arah yang disepakati protokol jaringan, sehingga kode yang membaca aliran jaringan hampir selalu memakainya secara eksplisit untuk kejelasan, sedangkan native dipakai saat bertukar data dengan pustaka pada mesin yang sama.
Bitstring dan penguraian sisa#
Segmen bitstring menampung urutan bit yang panjangnya bukan kelipatan byte, dan pencetakannya menyebut ukurannya secara eksplisit:
13> <<1:3>>.
<<1:3>>
14> bit_size(<<1:3>>).
3
15> byte_size(<<1:3>>).
1Nilai <<1:3>> berisi tiga bit, bit_size/1 menegaskan panjang aslinya, dan byte_size/1 melaporkan satu byte karena memori tetap dialokasikan per byte. Penguraian sisa memakai spesifikasi /binary seperti diperlihatkan pada modul Record dan string: pola <<Kepala:8, Sisa/binary>> mengambil satu byte lalu menyimpan seluruh sisanya, dan pola semacam ini berulang di dalam klausa fungsi untuk menguraikan protokol bertingkat. Dengan ukuran yang boleh berupa ekspresi, misalnya <<Panjang:8, Isi:Panjang/binary>>, header yang menyatakan panjang isi langsung menjadi spesifikasi polanya.
Kesalahan umum#
- Melupakan pemotongan tanpa error. Segmen integer bawaan hanya menampung 8 bit, dan nilai yang meluber dipotong diam-diam. Sebut ukuran yang sesuai, misalnya
:16, bila rentangnya lebih lebar. - Menemukan nilai yang tampak salah pada binary teks. Binary satu byte yang kebetulan valid UTF-8 dicetak sebagai karakter, seperti
<<"Å">>untuk byte 197 di atas.byte_size/1dan pemeriksaan angka membantu menyingkap isinya. - Mengabaikan urutan byte pada data lintas sistem. Angka 32-bit yang ditulis little-endian dan dibaca big-endian menghasilkan nilai yang sama sekali berbeda tanpa error apa pun. Arah byte adalah bagian dari spesifikasi, bukan detail.
Ringkasan#
- Bit syntax menyusun dan mengurai binary segmen demi segmen dengan ukuran bit eksplisit setelah tanda titik dua.
- Segmen integer bawaan 8 bit dan memotong kelebihan tanpa error, sehingga ukuran harus disebut sesuai rentang nilai.
- Kombinasi tipe, signed atau unsigned, dan arah big atau little menentukan pembacaan byte yang sama menjadi nilai berbeda.
- Bitstring menyimpan panjang bukan kelipatan byte, dan spesifikasi /binary dengan ukuran berupa ekspresi menjadi pola baku penguraian protokol.
Referensi#
- Erlang Reference Manual: Bit Syntax Expressions — Ericsson — Dokumentasi resmi segmen, tipe, dan atributnya pada bit syntax.
- Erlang Programming Examples: Bit Syntax — Ericsson — Contoh resmi konstruksi dan penguraian binary.
- Learn You Some Erlang for Great Good! — Fred Hebert — Bab yang memperkenalkan bit syntax dengan contoh protokol.