2009-06-08 8 views
5

私は16進数データを64進数に変換しなければなりません。バイナリ、 の代わりに、自分自身のコード変換を書き込む 1.hexadecimal私は、このリンクでこの部分を達成する方法を、 を10進数にhttp://necrobious.blogspot.com/2008/03/binary-to-hex-string-back-to-binary-in.html16進数64に符号付き

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の符号付き10進数のデータ

ありがとう事前に

答えて

11

これらの関数が取るerlang:list_to_integer(List, 16).を使用し、ちょうど戻って変換するにはerlang:integer_to_list(Int, 16).を使用し、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ビット符号付き整数を含む16進数文字列に整数に変換するには、あなたができるようになりました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

ありがとう以来、この16進数値3fc2d175e1028b9aため、PHPでイム書き込みコードがその4594464874087746458 64 10進値を与える場合はあなたが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

このアプローチはどうなりますか?あなたのanswer..its私は、もう一つの疑問を持っているneed..butものの非常に優れた、について説明用

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. 
関連する問題