【问题标题】:how to convert binary value to hex decimal in erlang如何在erlang中将二进制值转换为十六进制十进制
【发布时间】:2018-05-09 19:15:43
【问题描述】:

我得到像<<"0421">> 这样的二进制值和0x0421 的这个十六进制表示。 我必须得到这个十六进制值的位值。 在 2'base 表示中是 0000 0100 0010 0001

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

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

请帮我先把这个二进制转换成十六进制,然后再得到那些十六进制的位值。

【问题讨论】:

  • binary_to_integer(<<"0421">>, 16)?
  • 谢谢@Dogbert,我对erlang有点陌生。当我得到值 1057 和它的整数时,现在每个位都代表了一些东西。从位 0 到位 15。我现在怎样才能得到每一位。
  • 我已将其添加到我的答案中。
  • 非常感谢@Dogbert ...我正是需要这个。我不知道如何在开始时填充 4 个零。

标签: erlang


【解决方案1】:

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,等等

【讨论】:

    【解决方案2】:
    1> integer_to_list(binary_to_integer(<<"0421">>, 16),2).
    "10000100001"
    

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

    【讨论】:

    • 感谢您提供可能有助于解决问题的代码,但一般来说,如果答案包含对代码的用途以及解决问题的原因的解释,则会更有帮助。跨度>
    • @LordWilmore:虽然您认为对解决方案的解释通常比仅仅提供解决方案要好,但在这里我使用模块 erlang 中的函数,这是 Erlang 环境中最基本的模块。这就像解释+ 的含义,它实际上是来自同一模块的erlang:'+'/2 函数。我可以添加 RTFM 作为解释,但我认为这很粗鲁。
    【解决方案3】:

    您对结果的预期格式没有多说,基于 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>
    

    【讨论】:

      【解决方案4】:

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

      在外壳中:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2018-10-20
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多