2009-06-08 38 views
5

tôi có dữ liệu thập lục phân tôi phải chuyển đổi thành 64 dữ liệu thập phân đã ký .. vì vậy tôi nghĩ có bước follwoing như thế này. 1.hexadecimal để nhị phân, thay vì viết chuyển đổi mã riêng của tôi, tôi đang sử dụng mã được đưa ra trong liên kết này http://necrobious.blogspot.com/2008/03/binary-to-hex-string-back-to-binary-in.htmlhex đến 64 Ký số thập phân

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 sang thập phân, làm thế nào để đạt được phần này.?

hoặc bất kỳ cách nào khác để đạt được hexdecimal -> 64 ký dữ liệu Decimal

thanx trước

Trả lời

11

Để chuyển đổi một số nguyên vào một chuỗi hex, chỉ cần sử dụng erlang:integer_to_list(Int, 16). Để chuyển đổi trở lại, sử dụng erlang:list_to_integer(List, 16). Những chức năng mất một cơ số từ 2 đến 36 tôi tin.

Nếu bạn muốn chuyển đổi mã nhị phân đến và đi từ chuỗi hex bạn có thể sử dụng comprehensions danh sách việc cần làm cho nó ngăn nắp:

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

Để chuyển đổi một số nguyên vào một chuỗi hex chứa một ký số nguyên 64 bit, bạn có thể bây giờ làm:

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

thanx cho answer..its của bạn Giải thích rất tốt về những gì tôi need..but tôi có một nghi ngờ hơn, vì cho 3fc2d175e1028b9a giá trị thập lục phân này, nếu im viết code trong php cho nó 4594464874087746458 như 64 giá trị thập phân nhưng khi im làm điều tương tự như bạn đã nói hex_to_bin (Str) -><< << (erlang: list_to_integer ([H], 16)): 4 >> || H <- Str >>. nó đang cho << 63,194,209,117,225,2,139,154 >> vì vậy bất kỳ lời giải thích cho điều này .. xin vui lòng cho tôi biết whats sai về điều này. – Abhimanyu

+0

<> = hex_to_bin ("3fc2d175e1028b9a"), I =: = 4594464874087746458. - Bạn chỉ cần chuyển đổi số nhị phân thành số nguyên trong erlang (<< numbers >> ký hiệu cho biết nhị phân). – archaelus

0

Còn cách tiếp cận này thì sao?

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. 
Các vấn đề liên quan