Como faço para concatenar dois binários em Erlang?
Pergunta
Como faço para concatenar dois binários em Erlang?
Por exemplo, digamos que eu tenho:
B1 = <<1,2>>.
B2 = <<3,4>>.
Como faço para B1 e B2 concatenar para criar um B3 binário que é << 1,2,3,4 >>?
A razão que eu estou pedindo é porque eu estou escrevendo código para codificar um pacote por algum protocolo de rede. Estou implementando isso escrevendo encoders para os campos no pacote e eu preciso para concatenar os campos para construir o pacote inteiro.
Talvez eu estou fazendo isso da maneira errada. Devo construir o pacote como uma lista de números inteiros e converter a lista para um binário no último momento?
Solução
A resposta é não. gen_tcp: send aceita listas de profundidade. Assim, a concatenação é simplesmente:
B3 = [B1, B2].
Este é O (1). Em geral, quando se lida com este tipo de dados sempre construir estruturas Lista fundo e deixou as rotinas io andar a estrutura na saída. A única complicação é que nenhum rotinas intermediários terá aceitar listas de profundidade.
Outras dicas
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
Para usar um io_list, você poderia fazer:
erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
O que é bom e legível. Você também pode usar listas e coisas lá se é mais conveniente.
Para construir na última resposta:
bjoin(List) ->
F = fun(A, B) -> <<A/binary, B/binary>> end,
lists:foldr(F, <<>>, List).
usar o list_to_binary função erlang (Lista), você pode encontrar a documentação aqui: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1