二进制到整数 - >二郎神

时间:2011-01-23 01:59:08

标签: erlang binary integer

我有一个二进制M,这样34 =将始终存在,其余的可能在任意数量的数字之间变化,但总是一个整数。

M = [<<"34=21">>]

当我运行此命令时,我得到一个像

这样的答案
hd([X || <<"34=", X/binary >> <- M])

Answer -> <<"21">>

我怎样才能将它作为一个整体,尽可能高效地使用它?

3 个答案:

答案 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/1erlang: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倍。