如何在Erlang中连接两个二进制文件?
例如,假设我有:
B1 = <<1,2>>.
B2 = <<3,4>>.
如何连接B1和B2以创建二进制B3,其为&lt;&lt; 1,2,3,4&gt;&gt;?
我问这个的原因是因为我正在编写代码来编码某些网络协议的数据包。我通过为数据包中的字段编写编码器来实现这一点,我需要连接这些字段以构建整个数据包。
也许我这样做是错误的。我应该将数据包构建为整数列表,并在最后一刻将列表转换为二进制文件吗?
答案 0 :(得分:122)
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
答案 1 :(得分:35)
答案是否定的。 gen_tcp:send将接受深层列表。所以,连接就是:
B3 = [B1, B2].
这是O(1)。通常,在处理这类数据时,总是会构建深层列表结构,并让io例程在输出处遍历结构。唯一的复杂因素是任何中间例程都会接受深层列表。
答案 2 :(得分:18)
要使用io_list,您可以这样做:
erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
哪个好看又清晰。如果更方便的话,你也可以在那里使用列表和东西。
答案 3 :(得分:13)
以最后一个答案为基础:
bjoin(List) ->
F = fun(A, B) -> <<A/binary, B/binary>> end,
lists:foldr(F, <<>>, List).
答案 4 :(得分:8)
使用erlang函数list_to_binary(List),你可以在这里找到文档: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1