2009-03-01 13 views
46

¿Cómo concateno dos binarios en Erlang?¿Cómo concateno dos binarios en Erlang?

Por ejemplo, digamos que tengo:

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

¿Cómo concatenar B1 y B2 B3 para crear un binario que es < < 1,2,3,4 >>?

La razón por la que estoy preguntando esto es porque estoy escribiendo código para codificar un paquete para algún protocolo de red. Estoy implementando esto escribiendo codificadores para los campos en el paquete y necesito concatenar esos campos para construir todo el paquete.

Quizás estoy haciendo esto de la manera incorrecta. ¿Debo construir el paquete como una lista de enteros y convertir la lista a un binario en el último momento?

Respuesta

31

La respuesta es no. gen_tcp: send aceptará listas profundas. Entonces, la concatenación es simple:

B3 = [B1, B2]. 

Esto es O (1). En general, al tratar con este tipo de datos, siempre construya estructuras de listas profundas y deje que las rutinas io recorran la estructura en la salida. La única complicación es que cualquier rutina intermedia tendrá aceptar listas profundas.

+0

Gracias! No estaba familiarizado con los conceptos de listas profundas y listas de io en Erlang. –

+21

No creo que ese código sea correcto. Devuelve: '[<<1,2>>, <<3,4>>]' y esto no es lo que pidió @Cayle Spandon. Entonces la respuesta es incorrecta. – Worker

+2

@Worker - la respuesta que dio cthulahoops no tiene la intención de concatenar realmente los dos binarios. El objetivo de esta respuesta es que puedes evitar el costo computacional de concatenar los dos binarios en primer lugar, si el código con el que estás trabajando aceptará iolists. Dado que el autor de la pregunta original dijo que estaban tratando de crear un paquete de red, esta respuesta sugiere que tal vez concatenar los dos binarios no sea realmente la mejor manera de lograr lo que el interlocutor original necesita. – 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

Presumiblemente esto no es una operación O (1), por lo que todavía tendría sentido crear una lista profunda (lista IO) como sugerido por cthulahoops y posponer caminar la lista profunda hasta que esté listo para enviar el paquete? –

+15

Ambas respuestas son buenas. Las estructuras 'io_list' de cthulahoops son ideales para i/o; sin embargo, dado que este es ahora el principal hit de google para "binarios de concatenación de Erlang", es bueno tener la respuesta estrictamente correcta aquí también. – JasonSmith

12

de aprovechar la última respuesta:

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

esto es muy bueno! – Tommy

13

Para utilizar un io_list, se podría hacer:

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

que es agradable y legible. También podría usar listas y cosas allí si es más conveniente.