如何在erlang中将二进制值转换为十六进制小数

时间:2017-06-09 12:15:33

标签: erlang

我获得了像<<"0421">>这样的二进制值和0x0421的十六进制表示。 我必须得到这个十六进制值的位值。 在2&#39;基础表示中,这是0000 0100 0010 0001

所以我需要在Erlang中获取这个十六进制的每一位。

如果我使用list_to_integer(binary_to_list()),我会得到421整数。

请帮我先将这个二进制文件转换为十六进制,然后获取那些十六进制的位值。

4 个答案:

答案 0 :(得分:2)

binary_to_integer/2接受一个基数作为第二个参数。您可以将16传递给它以将十六进制二进制转换为整数:

1> binary_to_integer(<<"0421">>, 16).
1057
2> 16#0421.
1057

编辑:您可以使用模式匹配将16位中的每一位提取为16个变量:

1> Integer = binary_to_integer(<<"0421">>, 16).
1057
2> <<B0:1, B1:1, B2:1, B3:1, B4:1, B5:1, B6:1, B7:1, B8:1, B9:1, B10:1, B11:1, B12:1, B13:1, B14:1, B15:1>> = <<Integer:16>>.
<<4,33>>
3> {B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15}.
{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}

B0现在为0B51等。

答案 1 :(得分:0)

根据Dogbert的提议,您不会对预期的结果格式说太多,这是一个更自动化的解决方案。

1> HexToBin = fun(D) -> 
1> S = size(D) * 4,
1> I = binary_to_integer(D,16),
1> << << X >> || <<X:1>> <= << I:S >> >> 
1> end.
#Fun<erl_eval.6.52032458>
2> HexToBin(<<"0421">>). 
<<0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1>>
3> rp(HexToBin(<<"00123456789abcdef0421">>)).
<<0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,1,
  0,1,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,
  1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1>>
ok
4>

答案 2 :(得分:0)

1> integer_to_list(binary_to_integer(<<"0421">>, 16),2).
"10000100001"

请参阅相同核心erlang模块的文档。特别要注意integer_to_list/2的第二个参数。

答案 3 :(得分:-1)

Dogbert的解决方案可能会对大整数有点乏味。

bits(HexBin) ->
    bits(
      binary:encode_unsigned(
        binary_to_integer(HexBin, 16)
      ),
      []
    ).

bits(<<Bit:1, Rest/bitstring>>, Acc) ->
    bits(Rest, [Bit|Acc]);
bits(<<>>, Acc) ->
    list_to_tuple(lists:reverse(Acc)).

在shell中:

6> c(my).              
{ok,my}

7> my:bits(<<"0421">>).
{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}

8> LongResult = my:bits(<<"FFFFFFFFFFFFFF0421">>).        
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...}

9> io:format("~p~n", [LongResult]).
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}
ok