Elix的二进制模式匹配Integer或Convert Integer到binary

时间:2017-03-28 14:49:12

标签: pattern-matching elixir

我刚刚开始学习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

1 个答案:

答案 0 :(得分:7)

您可以使用<<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