我有一个二进制M,这样34 =将始终存在,其余的可能在任意数量的数字之间变化,但总是一个整数。
M = [<<"34=21">>]
当我运行此命令时,我得到一个像
这样的答案hd([X || <<"34=", X/binary >> <- M])
Answer -> <<"21">>
我怎样才能将它作为一个整体,尽可能高效地使用它?
答案 0 :(得分:21)
[<<"34=",X/binary>>] = M,
list_to_integer(binary_to_list(X)).
产生整数21
答案 1 :(得分:20)
As of R16B,可以使用BIF binary_to_integer/1
:
<强> OTP-10300 强>
添加了四个新的bif,
erlang:binary_to_integer/1,2
,erlang:integer_to_binary/1
,erlang:binary_to_float/1
和erlang:float_to_binary/1,2
。这些bifs的工作原理与方法类似 他们的列表对应物工作,除了他们操作 二进制文件。在大多数情况下,转换为二进制文件是和 比从列表转换更快。这些bifs会自动导入到erlang源文件中 因此可以在没有erlang前缀的情况下使用。
所以看起来像:
[<<"34=",X/binary>>] = M,
binary_to_integer(X).
答案 2 :(得分:1)
数字的字符串表示可以由N-48转换。对于多位数字,您可以折叠二进制数,乘以数字位置的幂:
-spec to_int(binary()) -> integer().
to_int(Bin) when is_binary(Bin) ->
to_int(Bin, {size(Bin), 0}).
to_int(_, {0, Acc}) ->
erlang:trunc(Acc);
to_int(<<N/integer, Tail/binary>>, {Pos, Acc}) when N >= 48, N =< 57 ->
to_int(Tail, {Pos-1, Acc + ((N-48) * math:pow(10, Pos-1))}).
这比使用list_to_integer(binary_to_list(X))
选项慢约100倍。