Erlang 二进制到整数->;二郎

Erlang 二进制到整数->;二郎,erlang,binary,integer,Erlang,Binary,Integer,我有一个二进制M,这样34=将始终存在,其余的可能在任意位数之间变化,但始终是一个整数 M = [<<"34=21">>] M=[] 当我运行这个命令时,我得到的答案如下 hd([X || <<"34=", X/binary >> <- M]) Answer -> <<"21">> hd([X | | | 如何使其成为一个整数,并尽可能提高效率?[]=M, [<<"34=",X/binary

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

M = [<<"34=21">>]
M=[]
当我运行这个命令时,我得到的答案如下

hd([X || <<"34=", X/binary >> <- M])

Answer -> <<"21">>
hd([X | | |
如何使其成为一个整数,并尽可能提高效率?

[]=M,
[<<"34=",X/binary>>] = M,
list_to_integer(binary_to_list(X)).
列表到整数(二进制到列表(X))。

这将产生整数
21

一个数字的字符串表示形式可以转换为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))}).
-spec to_int(binary())->integer()。
到\u int(Bin)的时间是\u binary(Bin)->
to_int(Bin,{size(Bin),0})。
to_int(u,{0,Acc})->
erlang:trunc(Acc);
当N>=48,N=<57->
to_int(Tail,{Pos-1,Acc+((N-48)*数学:pow(10,Pos-1))})。
此选项的性能比使用
列表到整数(二进制到列表(X))选项大约慢100倍。

,BIF可用于:

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
。这些BIF的工作原理与 他们的名单上的对应工作,除了他们的操作 二进制文件。在大多数情况下,从二进制文件到二进制文件的转换是 比从和转换到列表更快

这些BIF自动导入到erlang源文件中,可以 因此,可以在不使用erlang前缀的情况下使用

所以这看起来像:

[<<"34=",X/binary>>] = M,
binary_to_integer(X).
[]=M,
二进制_到_整数(X)。

这是最有效的方法吗?知道为什么没有直接从二进制到整数的函数吗?因为二进制默认是一组整数。您在这里所做的是使用整数字符的表示,Erlang知道这些字符可以解释为字符串。基本上,BIF可以“二进制到列表到整数”因为
=
已经只会给你“1”,我想这差不多是二进制到整数的转换。