2011-01-23 4 views
6

Mam binarne M takie, że 34 = zawsze będzie obecne, a reszta może się różnić między dowolną liczbą cyfr, ale zawsze będzie liczbą całkowitą.Binary to Integer -> Erlang

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

Kiedy uruchomić to polecenie uzyskać odpowiedź jak

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

Answer -> <<"21">> 

Jak mogę uzyskać to być liczbą całkowitą z największą staranność, aby jak najbardziej skuteczny?

Odpowiedz

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

To daje całkowitą 21

+0

Jest to najbardziej skuteczny sposób to zrobić? Każdy pomysł, dlaczego nie ma funkcji, aby przejść bezpośrednio z liczby binarnej do liczby całkowitej? – BAR

+1

ponieważ plik binarny jest domyślnie zbiorem liczby całkowitej. To, co tutaj zrobiliście, to reprezentacja liczb całkowitych, które Erlang wie, aby interpretować je jako ciąg znaków. Zasadniczo BIF to zrobiłby "binary_to_list_to_integer", ponieważ '<> = >' dałoby ci już tylko '1' i jest to raczej konwersja binarna na całkowitą, jak sądzę. –

1

znaków reprezentujący numer może być przekształcony przez N-48. Dla liczb wielocyfrowych można zagiąć binarny, mnożąc przez moc położenia cyfry:

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

Działanie to jest około 100 razy wolniej niż przy użyciu opcji list_to_integer(binary_to_list(X)).

17

As of R16B The BIF binary_to_integer/1 można stosować:

OTP-10300

dodane cztery nowe BIFS, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1 i erlang:float_to_binary/1,2. Te pliki bif działają podobnie jak ich odpowiedniki na liście, z wyjątkiem plików binarnych o numerach . W większości przypadków konwersja zi do plików binarnych jest szybsza niż konwersja zi do list.

Te pliki bif są automatycznie importowane do plików źródłowych Erlanga i dlatego można je używać bez prefiksu erlang.

Więc to będzie wyglądać:

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

w końcu to robią .. – BAR