Erlang學習筆記(七)二進位制型與位語法

畫船聽雨發表於2017-08-29

在大多數情況下,二進位制型裡的位數都會是8的整數倍,因此對應一個字串。如果位數不是8的整數倍,就稱這段資料為位串,所以說位串的時候強調資料裡的位數不是8的整數倍。

1. 二進位制

二進位制型的編寫和列印形式是雙小於號和雙大於號之間的一列整數或字串

<<5, 10, 20>>.
%<<5,10,20>>
<<"hello">>.
%<<"hello">>
<<65,66,67>>.
%<<"ABC">>

在二進位制中使用整數時,它必須屬於0至255這個範圍。
和字串類似,如果某個二進位制型的內容是可列印的字串,shell就會將這個二進位制型列印成字串,否則就列印成一列整數。

2. 操作二進位制

list_to_binary(L)->B %把io列表(iolist)L裡的素有元素壓扁後形成的二進位制  
split_binary(Bin,Pos)->{Bin1,Bin2} %在pos處把二進位制型Bin一分為二  
term_to_binary(Term)->Bin %把任何erlang資料型別轉換成二進位制型。  
binary_to_term(Bin)->Term %將二進位制型轉回來  
byte_size(Bin)->Size %返回二進位制型的位元組數  

3. 位語法

位語法是一種表示法,用於從二進位制資料裡提取或者加入單獨的位或者串。
開發位語法是為了進行協議程式設計,以及生產操作二進位制資料的高效程式碼。
如果是8的整倍,型別就是binary。如果不是,就是bitstring

M = <<X:N1,Y:N2,Z:N3>> %XYZ都是變數,N1N2N3都是各自所佔的位數。  
<<X:N1,Y:N2,Z:N3>> = M %讀取M中的資料到XYZ,跟上面的完全想法的操作。  
<<>>  
<<E1,E2,...,En>>  

單個Ei元素可以有4種形式:

Ei = Value |
     Value:Size |
     Value/TypeSpecifierList | 
     Value:Size/TypeSpecifierList
     %TypeSpecifierList 型別指定列表 End-Sign-Type-Unit
     %End可以是big| little | native
     %Sign可以是signed|unsigned Type可以是integer|float|binary|bytes|bitstring|bits|utf8|utf16|utf32預設值是integer
     %Unit的寫法是unit:1|2|...256

4. 位串:處理位級資料

對位串的模式匹配是位級操作,這樣我們就能在單次操作裡打包和解包位的序列。這對編寫需要操作位級資料的程式碼來說極其有用,例如沒有按照8位邊界對齊的資料或者可變長度資料,它們的資料長度用位而不是自己來表示。
在Erlang裡,最小可定址的儲存單元是1位,位串裡各個獨立的位序列可以直接訪問,無需任何移位和掩碼的操作。
位推導的二級制型的關係就像列表推導和列表的關係一樣。列表推導遍歷列表並返回列表,位推導遍歷二進位制型並生成列表或者二進位制型。
位推導:

[ X || <<X:N>> <= B]. %列表  
<< <<X>> || <<X:N>> <= B >>. %位串  

相關文章