Двоичный в целое число -> Erlang - PullRequest
8 голосов
/ 23 января 2011

У меня есть двоичный M, такой, что 34 = будет всегда присутствовать, а остальные могут варьироваться между любым количеством цифр, но всегда будут целыми числами.

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

Когда я запускаю эту команду, я получаюответ типа

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

Answer -> <<"21">>

Как я могу получить целое число с максимальной заботой, чтобы сделать его максимально эффективным?

Ответы [ 3 ]

21 голосов
/ 23 января 2011
[<<"34=",X/binary>>] = M,
list_to_integer(binary_to_list(X)).

Получает целое число 21

20 голосов
/ 12 июля 2013

Начиная с R16B , BIF binary_to_integer/1 может использоваться:

OTP-10300

Добавлено четыре новых бифа, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1 и erlang:float_to_binary/1,2. Эти бифы работают так же, как их коллеги по списку работают, за исключением того, что они работают на двоичные файлы. В большинстве случаев конвертация из и в двоичные файлы быстрее, чем конвертировать из и в списки.

Эти bif-файлы автоматически импортируются в исходные файлы erlang и могут поэтому используйте без префикса erlang.

Так это будет выглядеть так:

[<<"34=",X/binary>>] = M,
binary_to_integer(X).
2 голосов
/ 17 февраля 2013

Строковое представление числа может быть преобразовано с помощью 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))}).

Производительность при этом примерно в 100 раз ниже, чем при использовании опции list_to_integer(binary_to_list(X)).

...