在大多数情况下,二进制型里的位数都会是8的整数倍,因此对应一个字符串。如果位数不是8的整数倍,就称这段数据为位串,所以说位串的时候强调数据里的位数不是8的整数倍。
1. 二进制
二进制型的编写和打印形式是双小于号和双大于号之间的一列整数或字符串
<<5, 10, 20>>.
%<<5,10,20>>
<<"hello">>.
%<<"hello">>
<<65,66,67>>.
%<<"ABC">>
在二进制中使用整数时,它必须属于0至255这个范围。
和字符串类似,如果某个二进制型的内容是可打印的字符串,shell就会将这个二进制型打印成字符串,否则就打印成一列整数。
2. 操作二进制
list_to_binary(L)->B %把io列表(iolist)L里的素有元素压扁后形成的二进制
split_binary(Bin,Pos)->{Bin1,Bin2} %在pos处把二进制型Bin一分为二
term_to_binary(Term)->Bin %把任何erlang数据类型转换成二进制型。
binary_to_term(Bin)->Term %将二进制型转回来
byte_size(Bin)->Size %返回二进制型的字节数
3. 位语法
位语法是一种表示法,用于从二进制数据里提取或者加入单独的位或者串。
开发位语法是为了进行协议编程,以及生产操作二进制数据的高效代码。
如果是8的整倍,类型就是binary。如果不是,就是bitstring
M = <<X:N1,Y:N2,Z:N3>> %XYZ都是变量,N1N2N3都是各自所占的位数。
<<X:N1,Y:N2,Z:N3>> = M %读取M中的数据到XYZ,跟上面的完全想法的操作。
<<>>
<<E1,E2,...,En>>
单个Ei元素可以有4种形式:
Ei = Value |
Value:Size |
Value/TypeSpecifierList |
Value:Size/TypeSpecifierList
%TypeSpecifierList 类型指定列表 End-Sign-Type-Unit
%End可以是big| little | native
%Sign可以是signed|unsigned Type可以是integer|float|binary|bytes|bitstring|bits|utf8|utf16|utf32默认值是integer
%Unit的写法是unit:1|2|...256
4. 位串:处理位级数据
对位串的模式匹配是位级操作,这样我们就能在单次操作里打包和解包位的序列。这对编写需要操作位级数据的代码来说极其有用,例如没有按照8位边界对齐的数据或者可变长度数据,它们的数据长度用位而不是自己来表示。
在Erlang里,最小可寻址的存储单元是1位,位串里各个独立的位序列可以直接访问,无需任何移位和掩码的操作。
位推导的二级制型的关系就像列表推导和列表的关系一样。列表推导遍历列表并返回列表,位推导遍历二进制型并生成列表或者二进制型。
位推导:
[ X || <<X:N>> <= B]. %列表
<< <<X>> || <<X:N>> <= B >>. %位串