2017-03-28 94 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