2017-03-28 93 views
1

我刚开始学习Elixir,并陷入Integer的模式匹配。Elixir Integer的二进制模式匹配或整数转换为二进制

我清楚地知道如何搭配二进制,但我怎么也找不到匹配整数即从简单的整数提取高字节。 我必须将Integer转换为二进制或者写入一个函数,该函数从Integer开始需要高字节,但在库中没有发现任何关闭。

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

其中牛逼是整数,因为你可能猜到给

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

回答

4

可以转换为整数使用<<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 
+0

哇。谢谢! )) – Dmitry