от шестнадцати до 64 десятичных знаков - PullRequest
5 голосов
/ 08 июня 2009

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

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

или любой другой способ получения шестнадцатеричного числа -> 64-значных десятичных знаков со знаком

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

Ответы [ 2 ]

11 голосов
/ 08 июня 2009

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

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 голосов
/ 09 июня 2009

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

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...