【问题标题】:How to convert a binary to a base10 (decimal) integer in elixir如何在 elixir 中将二进制转换为 base10(十进制)整数
【发布时间】:2019-06-23 18:57:57
【问题描述】:

我希望能够将 elixir 字符串(二进制)转换为 base10 整数。

我已经能够通过以下方式做到这一点......

<<104, 101, 108, 108, 111>> # equal to string "hello"
|> Base.encode16()
|> Integer.parse(16)

{448378203247, ""}

上面做了我所追求的,但是感觉有点像黑客。我想...

  • 更好地了解这里到底发生了什么
  • 知道我是否/如何一步完成这项工作

【问题讨论】:

    标签: encoding int erlang elixir base


    【解决方案1】:

    由于 Elixir 字符串只是二进制文件,您可能可以使用 erlang :binary.decode_unsigned 函数将二进制数字转换为整数

    来自文档 http://erlang.org/doc/man/binary.html#decode_unsigned-1

    iex> :binary.decode_unsigned("hello")
    448378203247
    
    iex> :binary.encode_unsigned(448378203247)
    "hello"
    

    本质上,hello 的 ascii 值是

    <<104, 101, 108, 108, 111>>
    

    十进制转十六进制时可以写成

    <<68, 65, 6C, 6C, 6F>>
    

    或二进制形式

    <01101000, 01100101, 01101100, 01101100, 01101111>
    

    这是一系列存储为的字节

    68656C6C6F 十六进制或

    01101000_01100101_01101100_01101100_01101111 二进制

    其十进制(base-10)值为448378203247

    iex> Integer.to_string(448378203247, 16)
    "68656C6C6F"
    
    iex> Integer.to_string(448378203247, 2)
    "110100001100101011011000110110001101111"
    # each byte separated by _ is
    # "1101000_01100101_01101100_01101100_01101111"
    # missing a leading zero at the left, which doesn't change the value
    

    编辑:添加二进制示例,

    另外,两个十六进制数字可以用来完美地表示一个字节(编码 16 个值需要 4 位,0 到 15) 这就是为什么当我们用十六进制表示时,我们可以只连接十六进制值而不是当它们是十进制(base-10)表示法时

    来自The wiki for hexadecimal

    十六进制数字被计算机系统设计人员和程序员广泛使用,因为它们为二进制编码值提供了更人性化的表示。每个十六进制数字代表四个二进制数字,也称为半字节,即半个字节。例如,单个字节可以具有从 0000 0000 到 1111 1111 的二进制形式的值,可以更方便地表示为十六进制的 00 到 FF。

    【讨论】:

      【解决方案2】:

      在 Elixir 中将二进制(以 2 为底)数转换为十进制(以 10 为底)数:

      Integer.parse("1111111", 2) |&gt; elem(0) 给出 127

      :erlang.binary_to_integer(&lt;&lt;"1111111"&gt;&gt;, 2) 给出 127

      虽然这没有回答上面 OP 的示例,但它回答了他的标题。

      Also:Elixir 在其交互式控制台 (IEx) 中为我们提供了将二进制、八进制和十六进制数转换为十进制数的快捷方式。如果它是二进制的,则在您的号码前面加上0b,如果它是八进制,则用0o0x,如果它是十六进制,它会输出十进制版本。

      所以 0b1111111 在 IEx 中给出 127。

      在 Elixir 中将十进制数转换为二进制数:

      Integer.to_string(127, 2) 给出“1111111”

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 2014-03-13
        • 2018-08-08
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        相关资源
        最近更新 更多