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

Bru*_*man 51 erlang binaries

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

例如,假设我有:

B1 = <<1,2>>.
B2 = <<3,4>>.
Run Code Online (Sandbox Code Playgroud)

如何连接B1和B2以创建二进制B3,即<< 1,2,3,4 >>?

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

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

小智 124

28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
Run Code Online (Sandbox Code Playgroud)

  • 两个答案都很好.来自cthulahoops的`io_list`结构非常适合i/o; 然而,因为现在这是"erlang concatenate二进制文件"的热门搜索,所以在这里也能得到严格正确的答案. (17认同)

cth*_*ops 37

答案是不.gen_tcp:send将接受深层列表.所以,连接只是:

B3 = [B1, B2].
Run Code Online (Sandbox Code Playgroud)

这是O(1).通常,在处理这类数据时总是会构建深层列表结构,并让io例程在输出处遍历结构.唯一的复杂因素是任何中间例程都会接受深度列表.

  • 我不认为代码是对的.它返回:`[<< 1,2 >>,<< 3,4 >>]`这不是@Cayle Spandon所要求的.所以答案是对的. (24认同)
  • @Worker - cthulahoops给出的答案并不是为了实际连接两个二进制文件.这个答案的要点是,如果您正在使用的代码将接受iolists,那么您可以首先避免连接两个二进制文件的计算成本.由于最初的提问者说他​​们正在尝试构建一个网络数据包,这个答案表明,连接这两个二进制文件并不是实现原始提问者需要的最佳方式. (4认同)
  • @Nick这个答案没有回答[主题,标题]问题,因此无效.我来到这里是因为我必须在Erlang中连接两个二进制文件才能解决完全不同的问题.这也是OPs在一个问题中提出两个不同问题的错误,但这是谷歌对于通用问题"我如何连接两个二进制文件和Erlang"的最佳答案,并且它没有回答这个问题. (2认同)

Dav*_*ton 18

要使用io_list,您可以:

erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
Run Code Online (Sandbox Code Playgroud)

哪个好看又清晰.如果更方便的话,你也可以在里面使用列表和东西.


小智 13

建立最后的答案:

bjoin(List) ->
    F = fun(A, B) -> <<A/binary, B/binary>> end,
    lists:foldr(F, <<>>, List).
Run Code Online (Sandbox Code Playgroud)


Log*_*ldo 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