2011-01-23 12 views
6

Tengo un M binario tal que 34 = siempre estará presente y el resto puede variar entre cualquier número de dígitos, pero siempre será un número entero.Binario a entero -> Erlang

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

Cuando ejecuto este comando consigo una respuesta como

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

Answer -> <<"21">> 

¿Cómo puedo conseguir que esto sea un entero con el más cuidado para que sea lo más eficiente posible?

Respuesta

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

que produce el entero 21

+0

¿Es esta la manera más eficiente de hacerlo? ¿Alguna idea de por qué no hay una función para ir directamente de binario a entero? – BAR

+1

porque un binario es por defecto un conjunto de números enteros. Lo que ha hecho aquí se usa para la representación de caracteres enteros que Erlang sabe interpretar como una cadena. Básicamente, un BIF para hacerlo sería 'binary_to_list_to_integer' porque '<> = <<1,2,3>>' ya le daría solo '1' y eso es más o menos una conversión de binario a entero, supongo. –

1

Una representación de cadena de un número se pueden convertir por N-48. Para los números de varios dígitos se puede plegar sobre el binario, multiplicando por el poder de la posición del dígito:

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

El rendimiento de este es de alrededor de 100 veces más lento que usar la opción list_to_integer(binary_to_list(X)).

17

As of R16B, el BIF binary_to_integer/1 se puede utilizar:

OTP-10300

añadieron cuatro nuevos BIFS, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1 y erlang:float_to_binary/1,2. Estos bif funcionan de manera similar a como funcionan las contrapartes de la lista , excepto que operan en los binarios . En la mayoría de los casos, la conversión desde y hacia los binarios es más rápida que la conversión desde y hacia listas.

Estos bifs se importan automáticamente a los archivos de origen de Erlang y pueden utilizarse sin el prefijo erlang.

Para que se vería así:

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

finalmente lo hacen .. – BAR

Cuestiones relacionadas