Dmi*_*kov 4 elixir pattern-matching
我刚刚开始学习Elixir,并坚持使用Integer的模式匹配.
我很清楚如何匹配二进制,但我找不到如何匹配整数,即从一个简单的整数提取高字节.我必须将Integer转换为二进制或者编写一个从Integer获取高字节的函数,但在库中找不到任何内容.
<<y1::size(8), y2::size(8), y3::size(8), y4::size(8) >> = t
Run Code Online (Sandbox Code Playgroud)
其中t是整数,你可能会猜到
** (MatchError) no match of right hand side value: 3232235521
Run Code Online (Sandbox Code Playgroud)
您可以使用<<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}
Run Code Online (Sandbox Code Playgroud)
既然你已经有了一个整数,你也可以使用Bitwise运算符提取这些字节,但它的可读性更低:
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
Run Code Online (Sandbox Code Playgroud)