web-dev-qa-db-ja.com

Erlangで2つのバイナリを連結するにはどうすればよいですか?

Erlangで2つのバイナリを連結するにはどうすればよいですか?

たとえば、私が持っているとしましょう:

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

B1とB2を連結して、<< 1,2,3,4 >>であるバイナリB3を作成するにはどうすればよいですか?

私がこれを尋ねる理由は、いくつかのネットワークプロトコル用のパケットをエンコードするコードを書いているためです。これを実装するには、パケットのフィールドのエンコーダーを作成します。これらのフィールドを連結して、パケット全体を構築する必要があります。

多分私はこれを間違った方法でやっています。パケットを整数のリストとして作成し、最後にリストをバイナリに変換する必要がありますか?

50
Bruno Rijsman

答えはありません。 gen_tcp:sendはディープリストを受け入れます。したがって、連結は単純です。

B3 = [B1, B2].

これはO(1)です。一般に、この種のデータを処理するときは、常に深いリスト構造を構築し、ioルーチンに出力で構造を調べさせます。唯一の問題は、中間ルーチンがディープリストを受け入れることです。

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

Io_listを使用するには、次のようにします。

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

どちらがいいか判読できます。さらに便利であれば、リストやものをそこに使用することもできます。

18
David N. Welton

最後の答えを基にするには:

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

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

8
Logan Capaldo