Erlang 位串和二进制数据
?
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25876834&id=3300393
因為在本人工作中,服務(wù)端Erlang和客戶端的flash通信都是發(fā)送二進(jìn)制數(shù)據(jù)(協(xié)議)來通信,Erlang處理起來二進(jìn)制數(shù)據(jù)真的很方便,在空余時間查看和翻譯了Erlang的二進(jìn)制相關(guān)一些說明文檔,當(dāng)然里面也有根據(jù)自己的經(jīng)驗和知識理解的地方。
在二進(jìn)制解析部分,其實還有很多好的例子。還有就是Erlang的二進(jìn)制實際應(yīng)用的例子,下次會再分享的,翻譯不到位的地方,還請多多指正,原文地址 http://www.erlang.org/doc/programming_examples/bit_syntax.html#id64786, http://www.erlang.org/doc/reference_manual/expressions.html#id79300點擊(此處)折疊或打開
tuple_to_list/1將元組轉(zhuǎn)換為列表,time/0返回當(dāng)前時間的時,分,秒。
1> tuple_to_list({12,cat,”ddd”}).
[12,cat,"ddd"]
3> time().
{12,35,57}
2.二進(jìn)制數(shù)據(jù):
一種數(shù)據(jù)類型,用來實現(xiàn)原始數(shù)據(jù)的高速存儲。節(jié)省內(nèi)存,輸入輸出更加高效。書寫打印時,二進(jìn)制數(shù)據(jù)以一個整數(shù)或者字符序列的形式出現(xiàn),兩端分別用尖括號括起來。其中的整數(shù),每一個都要在0-255之間,如果二進(jìn)制數(shù)據(jù)是可以打印的字符串,shell將顯示字符串形式,否則會顯示一串整數(shù)。
@spec 描述函數(shù)的參數(shù)和返回類型。類型標(biāo)注,不是erlang代碼而是注釋文檔的一部分,shell中不能使用這些標(biāo)注。erlang中的模塊聲明也是注釋的一部分。
erlang通過BIF來構(gòu)造二進(jìn)制數(shù)據(jù)或者從中提取數(shù)據(jù),或者通過比特語法來完成這一過程。
@spec list_tbo_inary(IoList) -> binary()
@spec split_binary(Bin,Pos) -> {Bin1,Bin2}
@spec term_to_binary(Term) -> Bin
@spec binary_to_term(Bin) -> Term
list_tbo_inary將IoList中所有東西轉(zhuǎn)換為一個二進(jìn)制數(shù)據(jù)。split_binary在pos位置將二進(jìn)制數(shù)據(jù)分割成兩個部分。下面兩個是互逆。
4> Bin1 = <<1,2,3>>.
<<1,2,3>>
5> Bin2 = <<4,5>>.
<<4,5>>
6> Bin3 = <<6>>.
<<6>>
7> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).
<<1,2,3,1,2,3,4,5,4,6>>
12> split_binary(<<1,2,3,1,2,3,4,5,4,6>>,4).
{<<1,2,3,1>>,<<2,3,4,5,4,6>>
14> term_to_binary({11,’333a’,use}).
<<131,104,3,97,11,100,0,4,51,51,51,97,100,0,3,117,115,101>>
15> binary_to_term(<<131,104,3,97,11,100,0,4,51,51,51,97,100,0,3,117,115,101>>).
{11,’333a’,use}
返回二進(jìn)制數(shù)據(jù)字節(jié)長度
16> size(<<1,2,3,4>>).
4
3.比特語法
比特語法:一種模式匹配語法,用于二進(jìn)制數(shù)據(jù)中的比特進(jìn)行封包和解包工作。
比特語法是模式匹配的一種擴(kuò)展。編寫底層代碼時,常會需要對比特級別的二進(jìn)制數(shù)據(jù)進(jìn)行封包解包,會體現(xiàn)比特語法的便捷,比特語法針對協(xié)議編程而設(shè)計(erlang的看家本領(lǐng) 哇塞)。
16bit色彩的封包解包
19> Red = 2.
2
20> Green = 54.
54
21> Blue = 20.
20
22> Men = <<Red:5,Green:6,Blue:5>>.
<<22,212>>
23> Mem = <<Red:5,Green:5,Blue:5>>.
<<21,84:7>>
24> <<R1:5,G1:6,B1:5>> = Men.
<<22,212>>
25> R1.
2
27> G1.
54
28> B1.
20
可以看到是用:進(jìn)行匹配,冒號前是數(shù)據(jù),后是所占的比特數(shù)。
比特語法表達(dá)式
嗯,這里講比特語法格式:
比特語法的形式:<<>>或者<<E1,E2,E3,E4,…,En>>。Ei有四種形式:
Ei = Value | Value:Size | Value/TypeSpecifierList | Value:Size/TypeSpecifierList
二進(jìn)制數(shù)據(jù)中總比特數(shù)恰好被8整除(二進(jìn)制數(shù)據(jù)中每個字節(jié)都是8bit)。Value必須是一個綁定變量、文本串或者一個返回值的整數(shù)。浮點數(shù)、二進(jìn)制數(shù)據(jù)的表達(dá)式。Size必須為一個整型或者整型綁定變量,不能是自由變量。整型默認(rèn)Size為8,浮點型為64,二進(jìn)制則為本身長度。SpecifierList決定字節(jié)序,取值為:
@type End = big| little |native
書上給出一個例子來了解這三種排序和默認(rèn)排序,不同機(jī)器可能不同。
37> {<<16#12345678:32/big>>,<<16#12345678:32/little>>,<<16#12345678:32/native>>,<<16#12345678:32>>}.
{<<18,52,86,120>>,
<<120,86,52,18>>,
<<120,86,52,18>>,
<<18,52,86,120>>}
4.使用總結(jié)
塊表達(dá)式:
begin
Expr1,
….
Exprn
end
塊得值就是快中最后一個表達(dá)式的值,用于當(dāng)代碼某處只允許使用單個表達(dá)式而你要用一串表達(dá)式時。
注釋:
只有行注釋%,沒有塊注釋。
列表操作符++ ——:對列表進(jìn)行添加和刪除的中綴操作符。
比較表達(dá)式:
所有類型都定義了大小比較順序:
number<atom<reference<fun<port<pid<tuple<list<binary
作用:可以對存儲了任何類型的列表進(jìn)行排序,并根據(jù)比較順序,編寫高效的數(shù)據(jù)訪問代碼。
出了=:=,=/=外,其他都遵循下面規(guī)則:
如果一個比較參數(shù)為整數(shù),另一個浮點數(shù), 整數(shù)在比較前需要轉(zhuǎn)換成浮點數(shù)。
如果兩個比較參數(shù)都是整數(shù)或者浮點數(shù),直接比較。。。
==只適用于浮點數(shù)和整數(shù)的比較。最好都用=:=。
?
下劃線變量:
如果一個變量在一個字句中只被使用一次,編譯器會提出警告。但以下劃線開始,那么編譯器不會產(chǎn)生警告信息。
命名不準(zhǔn)備使用的變量,增加可讀性。方便調(diào)試。
轉(zhuǎn)載于:https://www.cnblogs.com/fvsfvs123/p/4241194.html
總結(jié)
以上是生活随笔為你收集整理的Erlang 位串和二进制数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [UE4]子控件Child Widget
- 下一篇: CentOS 7 中firewall-c