Erlangで2つのバイナリを連結するにはどうすればよいですか?
たとえば、私が持っているとしましょう:
B1 = <<1,2>>.
B2 = <<3,4>>.
B1とB2を連結して、<< 1,2,3,4 >>であるバイナリB3を作成するにはどうすればよいですか?
私がこれを尋ねる理由は、いくつかのネットワークプロトコル用のパケットをエンコードするコードを書いているためです。これを実装するには、パケットのフィールドのエンコーダーを作成します。これらのフィールドを連結して、パケット全体を構築する必要があります。
多分私はこれを間違った方法でやっています。パケットを整数のリストとして作成し、最後にリストをバイナリに変換する必要がありますか?
答えはありません。 gen_tcp:sendはディープリストを受け入れます。したがって、連結は単純です。
B3 = [B1, B2].
これはO(1)です。一般に、この種のデータを処理するときは、常に深いリスト構造を構築し、ioルーチンに出力で構造を調べさせます。唯一の問題は、中間ルーチンがディープリストを受け入れることです。
28> B1= <<1,2>>.
<<1,2>>
29> B2= <<3,4>>.
<<3,4>>
30> B3= <<B1/binary, B2/binary>>.
<<1,2,3,4>>
31>
Io_listを使用するには、次のようにします。
erlang:iolist_to_binary([<<"foo">>, <<"bar">>])
どちらがいいか判読できます。さらに便利であれば、リストやものをそこに使用することもできます。
最後の答えを基にするには:
bjoin(List) ->
F = fun(A, B) -> <<A/binary, B/binary>> end,
lists:foldr(F, <<>>, List).
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