如何加入位串列表?

时间:2013-12-29 19:13:38

标签: erlang

有一个位串列表,需要加入一个位串:

join(Bs) ->
    F = fun(B, Bt) -> <<B/bitstring, Bt/bitstring>> end,
    lists:foldr(F, <<>>, Bs).

请您更快地建议这样做吗?

3 个答案:

答案 0 :(得分:4)

您可以使用二进制理解:

join(Bs) = << <<B/bits>> || B <- Bs >>.

例如,在shell中尝试以下内容:

1> <<N:16>> = << <<B/bits>> || B <- [<<1:4>>, <<2:4>>, <<3:4>>, <<4:4>>] >>.
<<18,52>>
2> io:format("~.16#~n", [N]).
16#1234

答案 1 :(得分:4)

您应该阅读有关IO列表的内容。这是一篇关于这个主题的好博文: http://prog21.dadgum.com/70.html 我不知道你在做什么,但大多数时候你可以完全跳过加入二进制文件。当然,如果你绝对需要,你仍然可以这样做:

5> iolist_to_binary([<<"a">>, <<"b">>, <<"c">>]).
<<"abc">>

如果某些元素是字符串或字符,它也会起作用:

9> iolist_to_binary([<<"a">>, <<"b">>, "c", $d]).
<<"abcd">>

答案 2 :(得分:2)

虽然RichardC答案是完美的,但我会添加一些注意事项。与列表相反,当您加入二进制文件时,您应该更喜欢从头部开始(参见Constructing and matching binaries),否则最终会出现二次行为。因此,您可以将代码重写为

join(Bs) ->
    F = fun(B, Bt) -> <<Bt/bits, B/bits>> end,
    lists:foldl(F, <<>>, Bs).

这几乎与比特理解一样有效。无论如何,比特理解更简单有效。

join(Bs) -> << <<B/bits>> || B <- Bs >>.