有一个位串列表,需要加入一个位串:
join(Bs) ->
F = fun(B, Bt) -> <<B/bitstring, Bt/bitstring>> end,
lists:foldr(F, <<>>, Bs).
请您更快地建议这样做吗?
答案 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 >>.