Сопоставление двоичного шаблона Elixir с целым числом или преобразование целого числа в двоичное

Я только начал сегодня изучать Эликсир и застрял в сопоставлении с образцом Integer.

Я хорошо знаю, как сопоставить двоичный, но я не могу найти, как сопоставить Целое число, т.е. извлечь старший байт из простого целого числа. Я должен либо преобразовать целое число в двоичное, либо написать функцию, которая берет старший байт из целого числа, но не нашел ничего похожего в библиотеке.

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

где t целое число, как вы можете догадаться, дает

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

person Dmitry Dyachkov    schedule 28.03.2017    source источник


Ответы (1)


Вы можете преобразовать целое число в двоичное, используя <<x::32>> (сокращение от <<x::size(32)>>). Это будет преобразовано с использованием порядка байтов Big Endian. Для Little Endian вам нужно добавить -little, например <<x::little-32>>. Затем вы можете извлечь, используя шаблон, который вы уже упомянули (я снова сократил его, чтобы удалить size(), поскольку он не требуется):

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}

Поскольку у вас уже есть целое число, вы также можете извлечь эти байты с помощью побитовых операторов, но это менее читаемо:

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