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

StackOverflow https://stackoverflow.com/questions/600642

  •  03-07-2019
  •  | 
  •  

質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top