2009-06-08 5 views
5

У меня есть шестнадцатеричные данные. Мне нужно преобразовать в 64 подписи десятичных данных. Так что я думал, что следующий шаг подобен этому. 1.hexadecimal в двоичное, вместо того, чтобы писать собственную перекодировку я использую код, указанный в ссылке http://necrobious.blogspot.com/2008/03/binary-to-hex-string-back-to-binary-in.htmlhex to 64 Signed Decimal

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 в десятичной, , как достичь этой части.?

или любой другой способ достижения hexdecimal -> 64 десятичных данные

спасибо заранее

ответ

11

Чтобы преобразовать целое число в шестнадцатеричной строку, просто использовать erlang:integer_to_list(Int, 16). Для обратного преобразования используйте erlang:list_to_integer(List, 16). Эти функции я полагаю, что это радикал от 2 до 36.

Если вы хотите, чтобы преобразовать двоичные файлы и из шестнадцатеричных строк, которые вы можете использовать списочные, чтобы сделать его аккуратнее:

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

Чтобы преобразовать целое число в шестнадцатеричную строку, содержащую 64 разрядное целое, теперь вы можете 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

спасибо за ваши answer..its очень хорошо Explaination, что я need..but у меня есть еще одно сомнения, так как для этого шестнадцатеричного значения 3fc2d175e1028b9a, если им написание кода в PHP его подача 4594464874087746458 как 64 десятичное значения, но когда я делаю то же самое, что вы указали hex_to_bin (Str) -><< << (erlang: list_to_integer ([H], 16)): 4 >> || H <- Str >>. он дает << 63,194,209,117,225,2,139,154 >>, поэтому любое объяснение этого. Пожалуйста, скажите мне, что случилось с этим. – Abhimanyu

+0

<> = hex_to_bin ("3fc2d175e1028b9a"), I =: = 4594464874087746458. - Вам просто нужно преобразовать двоичный код в целое число в erlang (обозначение << numbers >> обозначает двоичный файл). – archaelus

0

Как насчет этого подхода?

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.