web-dev-qa-db-fra.com

Comment concaténer deux binaires dans Erlang?

Comment concaténer deux binaires dans Erlang?

Par exemple, disons que j'ai:

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

Comment concaténer B1 et B2 pour créer un B3 binaire qui est << 1,2,3,4 >>?

La raison pour laquelle je pose cette question est que j'écris du code pour encoder un paquet pour un protocole réseau. J'implémente cela en écrivant des encodeurs pour les champs du paquet et j'ai besoin de concaténer ces champs pour construire le paquet entier.

Peut-être que je fais ça de la mauvaise façon. Dois-je constituer le paquet sous forme de liste d'entiers et convertir la liste en binaire au dernier moment?

50
Bruno Rijsman

La réponse est non. gen_tcp: send acceptera les listes profondes. Ainsi, la concaténation est simplement:

B3 = [B1, B2].

C'est O (1). En général, lorsque vous traitez avec ce type de données, construisez toujours des structures de liste profondes et laissez les routines io parcourir la structure en sortie. La seule complication est que toutes les routines intermédiaires accepteront des listes profondes.

36
cthulahoops
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
122
Steve Kirsch

Pour utiliser une io_list, vous pouvez faire:

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

Ce qui est agréable et lisible. Vous pouvez également utiliser des listes et des choses là-dedans si c'est plus pratique.

18
David N. Welton

Pour construire sur la dernière réponse:

bjoin(List) ->
    F = fun(A, B) -> <<A/binary, B/binary>> end,
    lists:foldr(F, <<>>, List).
13
pommonico

utilisez la fonction erlang list_to_binary (List) vous pouvez trouver la documentation ici: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang .html # list_to_binary/1

8
Logan Capaldo