2011-01-23 6 views
6

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

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

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

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

Answer -> <<"21">> 

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

ответ

20
[<<"34=",X/binary>>] = M, 
list_to_integer(binary_to_list(X)). 

Это дает целое 21

+0

Это самый эффективный способ сделать это? Любая идея, почему нет функции перейти непосредственно из двоичного в целое? – BAR

+1

, потому что по умолчанию двоичный код представляет собой целое число. То, что вы здесь сделали, используется для представления целочисленных символов, которые, по мнению Эрланга, интерпретируются как строка. В принципе, BIF для этого будет 'binary_to_list_to_integer', потому что '<> = <<1,2,3>>' уже дал бы вам всего лишь 1, и это, скорее всего, преобразование с двоичным целым. –

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))}). 

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

17

As of R16B, ПЖФ binary_to_integer/1 может быть использован:

OTP-10300

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

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

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

[<<"34=",X/binary>>] = M, 
binary_to_integer(X). 
+0

наконец-то они это делают .. – BAR