Erlangで2つのバイナリを連結するにはどうすればよいですか?
質問
Erlangで2つのバイナリを連結するにはどうすればよいですか
たとえば、私が持っているとしましょう:
B1 = <<1,2>>.
B2 = <<3,4>>.
B1とB2を連結して、<!> lt; <!> lt; 1,2,3,4 <!> gt; <!> gt;であるバイナリ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
所属していません StackOverflow