首页 > Erlang并发教程 > 10.9 Erlang并发编程-二进制类型
2013
11-19

10.9 Erlang并发编程-二进制类型

BACK TOP文章索引

  1. 二进制类型
  2. 共3条评论

二进制类型

二进制类型是一种用于存储无类型内存区域的数据类型。若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)

将项式T转为二进制。得到的二进制数据对象为该项式的外部项式格式表示。

binary_to_term(Bin)

term_to_binary/1相反。

binary_to_list(Bin)

将二进制对象Bin转为证书列表。

binary_to_list(Bin, Start, Stop)

将二进制对象从StartStop的部分转为整数列表。二进制对象的位置下标从1开始计算。

list_to_binary(Charlist)

Charlist转为二进制数据对象。与term_to_binary(Charlist) 不同,该BIF构造的是一个包含Charlist所包含的字节序列的二进制对象,而前者是针对项式Charlist构造一个外部项式格式的二进制对象。

split_binary(Bin, Pos)

BinPos处切分为两个新的二进制对象。得到的是包含两个新二进制对象的元组。例如:

1> B = list_to_binary("0123456789").
#Bin
2> size(B).
10
3> {B1,B2} = split_binary(B,3).
{#Bin,#Bin}
4> size(B1).
3
5> size(B2).
7

concat_binary(ListOfBinaries)

构造一个串接二进制对象列表ListOfBinaries中的所有二进制对象的新二进制对象。

另外,保护式binary(X)X为二进制数据对象时返回成功。二进制对象主要用于网络中的代码加载,但也可用于那些需要处理大量音视频数据等原始数据的应用。通常可以高效地通过端口输入大量二进制数据,完成数据处理后,再输出到另一个或原先的端口。


10.9 Erlang并发编程-二进制类型》有 3 条评论

留下一个回复

你的email不会被公开。