9.Erlang 二进制操作

一,为什么使用二进制类型?

使用低级别的编程更加可靠,而且相比于元组和列表更加节省空间。有时候大量结构化的数据必须在计算机之间相互移动,我们就需要确保数据尽可能高效传播,利用一切可以存储的位置,每个位置尽可能含有较多的信息。

二,二进制类型

1.内置函数转化二进制

1>A={test,1,2,3,[1,2,3]}.
{test,1,2,3,[1,2,3]}
2> Bin1=term_to_binary(A).
<<131,104,5,100,0,4,116,101,115,116,97,1,97,2,97,3,107,0,
  3,1,2,3>>
3> Term1=binary_to_term(Bin1).
{test,1,2,3,[1,2,3]}
4> B=[1,2].
[1,2]
5> Bin2=list_to_binary(B).
<<1,2>>
6> Lis1=binary_to_list(Bin2).
[1,2]
7> Lis1=binary_to_list(Bin1).
** exception error: no match of right hand side value
                    [131,104,5,100,0,4,116,101,115,116,97,1,97,2,97,3,107,0,3,
                     1,2,3]

2.判断一个数据是不是二进制,可以使用is_binary

8> is_binary(Bin1).
true

3.提取出任意长度的二进制类型,使用split_binary

9> {Bin3,Bin4}=split_binary(Bin1,4).
{<<131,104,5,100>>,
 <<0,4,116,101,115,116,97,1,97,2,97,3,107,0,3,1,2,3>>}

4.可以直接书写二进制

14> Bin1= <<1,2,3>>.
<<1,2,3>>
15> binary_to_list(Bin1).
[1,2,3]
16> binary_to_term(Bin1).
** exception error: bad argument
     in function  binary_to_term/1
        called as binary_to_term(<<1,2,3>>)
17> <<E,F>> =Bin1.
** exception error: no match of right hand side value <<1,2,3>>
18> <<E,F,G>> =Bin1.
<<1,2,3>>

5.二进制的表达Expr:Size/Type

Size:以指定过的大小为单位,一个整数默认是8,浮点数数64(位)。

Type:一个类型说明符列表,并以连字符分隔,可以是如下内容

type——整数,浮点数,二进制,字节,位,串

sign——singed和unsigned,如果是sign,第一位0位正,1位负

endian——取决于CPU,默认是big,还有little和native。big表示第一字节是最低位,little第一字节最高位,运行的时候再确定是native

指定单位,比如unit:Val——使用的位的数目是Val*N,N是该值的大小,二进制和字节是8

22> <<Int1:2,Int2:6>> = <<128>>.
<<128>>
23> Int1.
2
24> Int2.
0
25> <<5:4/little-signed-integer-unit:4>>.
<<5,0>>

6.按位匹配

27> Bin= <<1,1:16>>.
<<1,0,1>>
28> <<D:16,F/binary>> =Bin.
<<1,0,1>>
29> [D,F].
[256,<<1>>]
33> Frame= <<1,3,0,0,1,0,0,0>>.
<<1,3,0,0,1,0,0,0>>
34> <<Type,Size,Bin:Size/binary-unit:8,_/binary>> =Frame.
<<1,3,0,0,1,0,0,0>>
35> Type.
1
36> Size.
3
37> Bin.
<<0,0,1>>
38> Size.
3

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章