首页 > 代码库 > Erlang--位语法
Erlang--位语法
(一)基本概念:
1、二进制型: 二进制的原始数据
2、Erlang虚拟机对二进制型的输入、输出和消息传递都做了优化,十分高效。
3、二进制型里的位数如果是8的倍数,则称为二进制型(binary)
4、二进制型里的位数如果不是8的倍数,则称为位串(bitstring)
(二)基本操作:
1、二进制型:是双小于号与双大于号之间的一列整数(0~255)或字符串。eg: <<5, 10, 20>>
2、二进制型的操作中重要的两个函数:
1、term_to_binary(Term) -> Bin. %这个函数能把任何Erlang数据类型转换成一个二进制型
2、binary_to_term(Bin) -> Term. %term_to_binary函数的逆操作
3、位语法表达式:
<<E1, E2, ...,En>> Ei = Value | Value:Size | Value/TypeSpecifierList | Value:Size/TypeSpecifierList
1、Value,可以是任何可以确定的值
2、Size, 一个整数,表示Value所占的位大小
3、TypeSpecifierList(类型指定列表),是一个用连字符分隔的列表,形式是 End-Sign-Type-Unit
1、End,它指定机器的字节顺序
1、big, 大端,默认,也是网络字节顺序
2、little,小端
3、native, 是指在运行时根据机器的CPU来确定,
例如:
{<<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>>}, 大家注意这是16进制,不是10进制的哈。
2、Sign,用于模式匹配, 标记数据的类型,因为有些数据带符号:
1、sign
2、unsigned, 默认值
3、Type,表示这个值的类型:可以是
integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32, 默认是integer
4、Unit, 表示这个单元所占的位数, 格式是: unit:Integer:
1、integer, float和bitstring的Unit默认值是1
2、binary, 为8
3、utf8, utf16, utf32类型无需要提供值,
例如:
<<X:4/little-signed-integer-unit:8>> %表示一个位数为32,包含一个带符号的整数,并且使用小端表示的二进制数据
4、二进制的匹配:
1、打包数据:
2、解析数据:
例如:
Red = 2#10000001, Green = 2#1000000000000010, Blue = 2#10000100, io:format("before unpack, Red is ~p, Green is ~p, Blue is ~p~n", [Red, Green, Blue]), RGB = <<Red:8/little-signed-integer-unit:1, Green:16/little-signed-integer-unit:1 , Blue:8/little-signed-integer-unit:1>>, % 此时RGB就是打包后的数据 io:format("The package bin is ~w~n", [RGB]), <<R1:8/little-signed-integer-unit:1, G1:16/little-signed-integer-unit:1 , B1:8/little-signed-integer-unit:1>> = RGB, % 此时R1, G1, B1就是解析来的数据 io:format("After unpack, Red is ~p, Green is ~p, Blue is ~p~n", [R1, G1, B1]).
注意:
1、因为默认是unsigned,所以我这里用的是signed,大家可以计算一下
Erlang--位语法