二进制类型
二进制类型是一种用于存储无类型内存区域的数据类型。若open_port/2的最后一个参数Settings列表中包含原子式binary,则打开的端口便是二进制端口。来自二进制端口的消息都是二进制类型的数据。
为了说明二进制端口和普通端口的区别,我们用“双字节包头加数据”协议从外部进程向Erlang发送字符串"hello"。外部程序将输出如下字节序列:
- 0 5 104 101 108 108 111
若与Erlang进程相连的端口是普通端口,则会向向进程发送消息{Port,{data,[104,101,108,108,111]}}。若是二进制端口,消息则是{Port,{data,Bin}},其中Bin是长度为5的二进制数据对象,内容即为消息中的字节数据。注意,在这两种情况下,向端口发送数据的外部进程没有区别。
令端口发送二进制对象而非列表的好处在于,相对于长列表,构造和发送二进制数据的速度要快很多。
下列BIF可用于二进制操作:
term_to_binary(T)binary_to_term(Bin)将项式T转为二进制。得到的二进制数据对象为该项式的外部项式格式表示。
binary_to_list(Bin)与term_to_binary/1相反。
binary_to_list(Bin,Start,Stop)将二进制对象Bin转为证书列表。
list_to_binary(Charlist)将二进制对象从Start到Stop的部分转为整数列表。二进制对象的位置下标从1开始计算。
split_binary(Bin,Pos)将Charlist转为二进制数据对象。与term_to_binary(Charlist) 不同,该BIF构造的是一个包含Charlist所包含的字节序列的二进制对象,而前者是针对项式Charlist构造一个外部项式格式的二进制对象。
concat_binary(ListOfBinaries)将Bin从Pos处切分为两个新的二进制对象。得到的是包含两个新二进制对象的元组。例如:
- 1> B = list_to_binary("0123456789").#Bin2> size(B).103> {B1,B2} = split_binary(B,3).{#Bin,#Bin}4> size(B1).35> size(B2).7
构造一个串接二进制对象列表ListOfBinaries中的所有二进制对象的新二进制对象。
另外,保护式binary(X)在X为二进制数据对象时返回成功。二进制对象主要用于网络中的代码加载,但也可用于那些需要处理大量音视频数据等原始数据的应用。通常可以高效地通过端口输入大量二进制数据,完成数据处理后,再输出到另一个或原先的端口。