首页 > 代码库 > 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--位语法