Erlang(五)二进制型与位语法

二进制型是一种十分节省空间的保存大批量数据的方式

二进制型的编写和打印形式是双小于号和双大于号之间一列数字或字符串。整数范围在0-255之间,字符以ASCII编码的形式,

操作二进制型

list_to_binary(L) -> B
split_binary(Bin, Pos) -> {Bin1, Bin2}.
split_binary(<<1,2,3,4,5,6>>, 3) -> {<<1,2,3>>,<<4,5,6>>}.
term_to_binary(Term) -> Bin.

erlang数据转成二进制型,可保存为文件,进行网络传输

binary_to_term(Bin) -> Term.
byte_size(Bin) -> Size.

返回二进制型的字节数

打包和解包16为颜色

R 5位,G 6位, B 5位

Red = 2.
Green = 61.
Blue = 20.
Mem = <<Red:5, Green:6, Blue:5>>.
<<R1:5, G1:6, B1:5>>  = Mem.
R1.
G1.
B1.

位语法

<<>>
<<E1, E2, ..., En>>

% 每个Ei元素都标示出二进制型或位串的一个片段。单个Ei元素可以有4种形式。

Ei = Value |
    Value:Size |
    Value/TypeSpecifierList |
    Value:Size/TypeSpecifierList

表达式的总位数是8的整数倍,就会构建一个二进制型, 否则构建一个位串。

Value 必须是已绑定变量,字符串,或是能得出整数,浮点数或二进制型的表达式。

Size 必须是整数,默认值取决于不同的数据类型,整数8,浮点数64,二进制型则是就二进制型的大小。

TypeSpecifierList 类型指定列表,形式为End-Sign-Type-Unit。任何被省略项,取其默认值。

End 字节顺序,可为big | little | native,默认big。

Sign 用于模式匹配,可为signed unsigned,默认unsigned。

Type 可为integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32,默认integer。

Unit 写法unit:1|2|…256,integer,float,bitstring默认为1,binary默认为8。utf8,utf6和utf32无需提供值。

一个片段的总长度是Size x Unit字节。binary类型的片段长度必须是8的整数倍。

-define (IP_VERSION, 4).
-define (IP_MIN_HDR_LEN, 5).
...
DgramSize = byte_size(Dgram),
case Dgram of
    <<?IP_VERSION:4, Hlen:4, SrvcType:8, TotLen:16,
    ID:16, Flag:3, FragOff:13,
    TTL:8, Proto:8, HdrChkSum:16,
    SrcIP:32,
    DestIP:32, RestDgram/binary>> when Hlen >= 5, 4*Hlen =< DgramSize ->
        OptsLen = 4*(Hlen - ?IP_MIN_HDR_LEN),
        <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
        ...

大多数编程语言,最小可寻址的存储单元是8位,对位操作需要移位和掩码操作。

在erlang里,最小可寻址的存储单元是1位,位串里每个独立的序列都可以直接访问,无需任何移位和掩码操作。

位推导

B = <<16#5f>>
[X || <<X:1>> <= B].
<< <<X>> || <<X:1>> <= B >>.
erlang9