2009-03-01 92 views
46

如何连接Erlang中的两个二进制文件?如何连接Erlang中的两个二进制文件?

例如,假设我有:

B1 = <<1,2>>. 
B2 = <<3,4>>. 

如何串联B1和B2,以创建一个二进制B3是< < 1,2,3,4 >>?

我问这个问题的原因是因为我正在编写代码来编码某个网络协议的数据包。我通过为数据包中的字段编写编码器来实现这一点,我需要连接这些字段来构建整个数据包。

也许我这样做是错误的。我是否应该将数据包构建为整数列表,并在最后时刻将列表转换为二进制文件?

回答

31

答案是没有。 gen_tcp:send将接受深度列表。因此,级联很简单:

B3 = [B1, B2]. 

这是O(1)。一般来说,处理这类数据时总会建立深层的列表结构,并让输入的io例程遍历结构。唯一的问题是任何中间例程都会接受深度列表。

+0

谢谢!我不熟悉Erlang深层列表和io列表的概念。 – 2009-03-02 00:51:47

+21

我不是这个代码是正确的。它返回:`[<<1,2>>,<<3,4>>],这不是@Cayle Spandon所要求的。所以答案是错的。 – Worker 2012-02-16 12:02:30

+2

@Worker - cthulahoops给出的答案并不是要实际连接两个二进制文件。这个答案的重点在于,如果您正在使用的代码将接受iolist,那么您可以避免首先连接两个二进制文件的计算成本。由于最初的提问者说他​​们试图构建一个网络数据包,这个答案表明,也许连接这两个二进制文件并不是真正实现原始提问者所需要的最好方式。 – Nick 2016-02-05 19:18:31

112
28> B1= <<1,2>>. 
<<1,2>> 
29> B2= <<3,4>>. 
<<3,4>> 
30> B3= <<B1/binary, B2/binary>>. 
<<1,2,3,4>> 
31> 
12

要建立的最后一个答案:

bjoin(List) -> 
    F = fun(A, B) -> <<A/binary, B/binary>> end, 
    lists:foldr(F, <<>>, List). 
13

要使用io_list,你可以这样做:

erlang:iolist_to_binary([<<"foo">>, <<"bar">>]) 

这是很好的和清晰的。如果更方便,您还可以使用列表和内容。

相关问题