Pencocokan pola biner Elixir dari Integer atau Konversi Integer ke biner

Saya baru mulai belajar hari ini Elixir dan terjebak dalam pencocokan pola Integer.

Saya tahu betul cara mencocokkan biner, tetapi saya tidak dapat menemukan cara mencocokkan Bilangan Bulat yaitu mengekstrak byte tinggi dari Integer sederhana. Saya harus mengonversi Integer ke biner atau menulis fungsi yang mengambil byte tinggi dari Integer, tetapi tidak menemukan apa pun yang mendekati di perpustakaan.

<<y1::size(8), y2::size(8),  y3::size(8), y4::size(8) >> = t

di mana t adalah Integer seperti yang Anda duga

** (MatchError) no match of right hand side value: 3232235521

person Dmitry Dyachkov    schedule 28.03.2017    source sumber


Jawaban (1)


Anda dapat mengonversi bilangan bulat ke biner menggunakan <<x::32>> (kependekan dari <<x::size(32)>>). Ini akan mengkonversi menggunakan urutan byte Big Endian. Untuk Little Endian, Anda perlu menambahkan -little, seperti <<x::little-32>>. Anda kemudian dapat mengekstrak menggunakan pola yang telah Anda sebutkan (sekali lagi saya menyingkatnya untuk menghapus size() karena tidak diperlukan):

iex(1)> <<y1::8, y2::8, y3::8, y4::8>> = <<3232235521::32>>
<<192, 168, 0, 1>>
iex(2)> {y1, y2, y3, y4}
{192, 168, 0, 1}
iex(3)> <<y1::8, y2::8, y3::8, y4::8>> = <<3232235521::little-32>>
<<1, 0, 168, 192>>
iex(4)> {y1, y2, y3, y4}
{1, 0, 168, 192}

Karena Anda sudah memiliki bilangan bulat, Anda juga dapat mengekstrak byte ini menggunakan operator Bitwise, tetapi cara ini kurang mudah dibaca:

iex(1)> use Bitwise
Bitwise
iex(2)> n = 3232235521
3232235521
iex(3)> n &&& 0xff
1
iex(4)> n >>> 8 &&& 0xff
0
iex(5)> n >>> 16 &&& 0xff
168
iex(6)> n >>> 24 &&& 0xff
192
person Dogbert    schedule 28.03.2017