2009-03-01 7 views
46

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 puis-je concaténer B1 et B2 pour créer un B3 binaire qui est < < 1,2,3,4 >>?

La raison pour laquelle je demande ceci est parce que j'écris le code pour coder un paquet pour un certain protocole de gestion de réseau. J'implémente ceci en écrivant des encodeurs pour les champs dans le paquet et j'ai besoin de concaténer ces champs pour construire le paquet entier. Peut-être que je fais cela dans le mauvais sens. Devrais-je construire le paquet comme une liste d'entiers et convertir la liste en un binaire au dernier moment?

Répondre

31

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

B3 = [B1, B2]. 

Ceci est O (1). En général, lorsque vous manipulez ce type de données, vous 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 auront des listes profondes.

+0

Merci! Je ne connaissais pas les concepts des listes profondes et des listes io à Erlang. –

+21

Je ne sais pas que ce code est correct. Il renvoie: '[<<1,2>>, <<3,4>>]' et ce n'est pas ce que @Cayle Spandon a demandé. Donc, la réponse est fausse. – Worker

+2

@Worker - la réponse fournie par cthulahoops n'est pas destinée à concaténer les deux binaires. Le point de cette réponse est que vous pouvez éviter le coût de calcul de la concaténation des deux binaires en premier lieu, si le code que vous utilisez acceptera des iolists. Puisque le questionneur original a dit qu'ils essayaient de construire un paquet de réseau, cette réponse suggère que peut-être concaténant les deux binaires n'est pas vraiment la meilleure manière de réaliser ce dont le questionneur original a besoin. – Nick

112
28> B1= <<1,2>>. 
<<1,2>> 
29> B2= <<3,4>>. 
<<3,4>> 
30> B3= <<B1/binary, B2/binary>>. 
<<1,2,3,4>> 
31> 
+0

Il ne s'agit probablement pas d'une opération O (1), il serait donc logique de créer une liste profonde (liste d'E/S) suggéré par cthulahoops et remettre à plus tard la liste profonde jusqu'à ce que je suis prêt à envoyer le paquet? –

+15

Les deux réponses sont bonnes. Les structures 'io_list' de cthulahoops sont idéales pour les E/S; Cependant, puisque c'est maintenant le top google hit pour "erlang concatenate binaires", il est bon d'avoir la réponse strictement correcte ici aussi. – JasonSmith

12

Pour construire la dernière réponse:

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

c'est très bien! – Tommy

13

Pour utiliser un 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 si c'est plus pratique.

Questions connexes