28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
You can concatenate binaries using bit syntax:
1> B1 = <<1,2>>.
<<1,2>>
2> B2 = <<3,4>>.
<<3,4>>
3> B3 = <<B1/binary, B2/binary>>.
<<1,2,3,4>>
In many cases, particularly where the data is destined for the network you can avoid the concatenation by constructing an io_list instead.
B3 = [B1, B2],
gen_tcp:send(Socket, B3).
This is O(1) as it avoids copying either binary. gen_tcp:send
will accept the deep list and walk the structure for output. (A two element list takes very little additional memory, so the memory overhead is small.)
In some cases (repeated appends to the same binary), Erlang now has optimisations that avoid copying the binary being appended to so using io_lists may be less relevant: http://erlang.org/doc/efficiency_guide/binaryhandling.html#constructing-binaries
Historical note: I originally advised only the io_list solution and a lot of commenters correctly point out that I failed to answer the question. Hopefully, the accepted answer is now complete. (11 years later!)
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.
To build on the last answer:
bjoin(List) ->
F = fun(A, B) -> <<A/binary, B/binary>> end,
lists:foldr(F, <<>>, List).
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With