How do I concatenate two binaries in Erlang?

2019-01-21 21:44发布

How do I concatenate two binaries in Erlang?

For example, let's say I have:

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

How do I concatenate B1 and B2 to create a binary B3 which is <<1,2,3,4>>?

The reason I am asking this is because I am writing code to encode a packet for some networking protocol. I am implementing this by writing encoders for the fields in the packet and I need to concatenate those fields to build up the whole packet.

Maybe I am doing this the wrong way. Should I build up the packet as a list of integers and convert the list to a binary at the last moment?

5条回答
走好不送
2楼-- · 2019-01-21 22:00
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
查看更多
Root(大扎)
3楼-- · 2019-01-21 22:11

To build on the last answer:

bjoin(List) ->
    F = fun(A, B) -> <<A/binary, B/binary>> end,
    lists:foldr(F, <<>>, List).
查看更多
smile是对你的礼貌
4楼-- · 2019-01-21 22:21

To use an io_list, you could do:

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

Which is nice and legible. You could also use lists and things in there if it's more convenient.

查看更多
相关推荐>>
5楼-- · 2019-01-21 22:23

use the erlang function list_to_binary(List) you can find the documentation here: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1

查看更多
对你真心纯属浪费
6楼-- · 2019-01-21 22:24

The answer is don't. gen_tcp:send will accept deep lists. So, concatenation is simply:

B3 = [B1, B2].

This is O(1). In general, when dealing with this sort of data always build up deep list structures and let the io routines walk the structure at output. The only complication is that any intermediate routines will have accept deep lists.

查看更多
登录 后发表回答