binary二进制

Bit语法把二进制数据放在 << 和 >> 之间,通过逗号把它切分成方便阅读的段(segment)。每一段都是二进制数据中的一个bit序列。


Erlang中bit串的描述方式包括:

Value
Value:Size
Value/TypeSpecifierList
Value:Size/TypeSpecifierList

TypeSpecifierList有“Unit:xxx”, “Type”,“Signedness”还有“Endianness”几种,使用时用(-)来隔开:

-Value. 这个bit串代表的这个数值为多少。
-Size. 这一bit串占用了多少Unit。

-Unit:x. x取值范围是1-255,表示每Unit占的bit数

-Type. 这个属性描述了bit流是按什么方式组织的,
有integer, float, binary(bytes),bitstring(bits),utf8,utf16,and utf32。
默认integer。

integer、float和bits(bitstring)的默认长度为1,binary的默认长度为8。
utf8,utf16 和 utf32类型不需要定义单位。

integer 默认的Size为8  B/integer  占1个字节
float 默认的Size为64  B/float 占8个字节
binary 没有默认的Size, 必须指定Size, 除非匹配的尾部,可以不用制定Size
bits 同样没有默认的Size,和binary一样。

byte_size(B) --> 可以计算B占用的字节数,只能binary或bits类型的参数

-Signedness.这一属性只有两个选项signed和unsigned,默认是unsigned。同时,只有bit串是integer类型的时候,我们才会考虑这一属性。

-Endianness.可能的值有big,little,native,默认是big.同时,大小端只有在数据是integer,utf16, utf32,或者是float时有用。native取决于cpu运行时使用大端还是小端。


> <<8:8/unit:2>> == <<8:16>>. 相当 <<0, 8>>.
> <<123456:16/unit:2>>.   -》 <<0,1,226,64>>
> <<123456:32>>.   -》 <<0,1,226,64>>

<<0:1>> 表示1个bit位,等同于 <<0:1/integer:unit:1>>  即 Size=1, Unit=1
<<0:1/unit:16>> 表示 16个bit 即 <<0, 0>>


标准的二进制操作
bsl(bit左移),bsr(bit右移),band,bor,bxor,和bnot。

2#00100 = 2#00010 bsl 1.
2#00001 = 2#00010 bsr 1.
2#10101 = 2#10001 bor 2#00101.

binary 模块:
Bin = list_to_binary([121, 11, 255]).  // 数字不能等于大于256
Bin1 = <<121, 11, 259>>. // 里面的数字可以大于256
  实质 等于 <<121, 11, 3>>.  即需要模256
Bin2 = list_to_binary("hello erlang").  // 不能包含中文

at(Bin, Pos) -> byte()  // pos 从0开始,获取对应的字节

BinUnit = <<1,2,3>>.
Bin = binary:copy(BinUnit, 50). 

<<Bin2:1/binary, _/binary>>.  // 除了尾部,使用Type=binary必须指定Size的值,

Erlang只是不太适合用于大量的数字运算。
它可以在毫秒级时间内处理事件,是软实时应用的不错选择。

猜你喜欢

转载自catdoc.iteye.com/blog/2109618
今日推荐