Как объединить два двоичных файла в Erlang? - PullRequest
49 голосов
/ 02 марта 2009

Как объединить два двоичных файла в Erlang?

Например, скажем, у меня есть:

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

Как объединить B1 и B2, чтобы создать двоичный файл B3 с размером << 1,2,3,4 >>?

Причина, по которой я спрашиваю об этом, заключается в том, что я пишу код для кодирования пакета для некоторого сетевого протокола. Я реализую это, написав кодировщики для полей в пакете, и мне нужно объединить эти поля, чтобы собрать весь пакет.

Может быть, я делаю это неправильно. Должен ли я создать пакет как список целых чисел и преобразовать список в двоичный файл в последний момент?

Ответы [ 5 ]

122 голосов
/ 02 марта 2009
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
35 голосов
/ 02 марта 2009

Ответ - нет. gen_tcp: send будет принимать глубокие списки. Итак, конкатенация это просто:

B3 = [B1, B2].

Это O (1). В общем, при работе с данными такого рода всегда создавайте структуры с глубоким списком и позволяйте процедурам io обходить структуру при выводе. Единственное осложнение состоит в том, что любые промежуточные подпрограммы будут иметь глубокие списки.

18 голосов
/ 19 февраля 2014

Чтобы использовать io_list, вы можете сделать:

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

Что хорошо и разборчиво. Вы также можете использовать списки и тому подобное, если это удобнее.

13 голосов
/ 17 декабря 2009

Для построения последнего ответа:

bjoin(List) ->
    F = fun(A, B) -> <<A/binary, B/binary>> end,
    lists:foldr(F, <<>>, List).
8 голосов
/ 02 марта 2009

используйте функцию erlang list_to_binary (List), вы можете найти документацию здесь: http://www.erlang.org/documentation/doc-5.4.13/lib/kernel-2.10.13/doc/html/erlang.html#list_to_binary/1

...