2009-06-08 12 views
5

tengo datos hexadecimales que tengo que convertir en 64 datos decimales firmados ... así que pensé en seguir este paso. 1.hexadecimal a binario, en lugar de escribir mi propia conversión de código i estoy usando código dado en este enlace http://necrobious.blogspot.com/2008/03/binary-to-hex-string-back-to-binary-in.htmlhexadecimal a 64 decimal firmado

bin_to_hexstr(Bin) -> 
    lists:flatten([io_lib:format("~2.16.0B", [X]) || 
    X <- binary_to_list(Bin)]). 

hexstr_to_bin(S) -> 
    hexstr_to_bin(S, []). 
hexstr_to_bin([], Acc) -> 
    list_to_binary(lists:reverse(Acc)); 
hexstr_to_bin([X,Y|T], Acc) -> 
    {ok, [V], []} = io_lib:fread("~16u", [X,Y]), 
    hexstr_to_bin(T, [V | Acc]). 

2.binary a decimal, cómo lograr esta parte.?

o cualquier otra forma de lograr la hexdecimal -> 64 Firmado datos decimales

Gracias de antemano

Respuesta

11

Para convertir un entero a una cadena hexadecimal, sólo tiene que utilizar erlang:integer_to_list(Int, 16). Para convertir de nuevo, utilizar erlang:list_to_integer(List, 16). Estas funciones toman una base de 2 a 36 creo.

Si desea convertir archivos binarios desde y hacia las cadenas hexagonales puede utilizar listas por comprensión para que sea más ordenado:

bin_to_hex(Bin) -> [ hd(erlang:integer_to_list(I, 16)) || <<I:4>> <= Bin ]. 
hex_to_bin(Str) -> << << (erlang:list_to_integer([H], 16)):4 >> || H <- Str >>. 

Para convertir un entero a una cadena hexadecimal que contiene un entero de 64 bits, ahora puede do:

Int = 1 bsl 48, HexStr = bin_to_hex(<<Int:64/signed-integer>>), 
Bin = hex_to_bin(HexStr), <<RoundTrippedInt:64/signed-integer>> = Bin, 
Int =:= RoundTrippedInt. 
+0

gracias por sus answer..its muy buena explicación de lo que need..but tengo una duda más, ya que para este valor hexadecimal 3fc2d175e1028b9a, si el código escrito en php im su 4594464874087746458 dando como valor decimal 64, pero cuando estoy haciendo lo mismo que has declarado hex_to_bin (Str) -><< << (erlang: list_to_integer ([H], 16)): 4 >> || H <- Str >>. está dando << 63,194,209,117,225,2,139,154 >>. Así que cualquier explicación para esto ... por favor dime qué es lo que está mal en esto. – Abhimanyu

+0

<> = hex_to_bin ("3fc2d175e1028b9a"), I =: = 4594464874087746458. - Solo necesita convertir el binario a un entero en erlang (la notación << numbers >> indica un binario). – archaelus

0

¿Qué tal este enfoque?

hex2int(L) -> 
    << I:64/signed-integer >> = hex_to_bin(L), 
    I. 

int2hex(I) -> [ i2h(X) || <<X:4>> <= <<I:64/signed-integer>> ]. 

hex_to_bin(L) -> << <<(h2i(X)):4>> || X<-L >>. 

h2i(X) -> 
    case X band 64 of 
     64 -> X band 7 + 9; 
     _ -> X band 15 
    end. 

i2h(X) when X > 9 -> $a + X - 10; 
i2h(X) -> $0 + X. 
Cuestiones relacionadas