如何在Elixir中将二进制转换为十进制整数

10

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

我已经通过以下方式实现了这一点...

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

{448378203247, ""}

上面的代码实现了我想要的效果,但感觉有点像是hack。我想要:

  • 更好地理解这里到底发生了什么
  • 知道是否/如何能够在一步中完成此操作
  • 更好地理解这里究竟发生了什么;
  • 知道是否以及如何能够在一步中完成此操作。
2个回答

14

由于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,

它们的十进制(基于十)值为 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

编辑:添加二进制示例

此外,两个十六进制数字可以完美地表示一个字节(需要4位编码16个值,从0到15),这就是为什么当我们使用十六进制表示时,我们可以将十六进制值连接起来,而不是在十进制(基数10)表示法中。

来自十六进制维基百科

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


4

将二进制(基数为2)转换为十进制(基数为10)的Elixir代码:

Integer.parse("1111111", 2) |> elem(0)的结果是127

:erlang.binary_to_integer(<<"1111111">>, 2)的结果是127

虽然这不是回答原帖中的例子,但回答了他的标题。

此外,Elixir在其交互式控制台(IEx)中提供了快捷方式,可以将二进制、八进制和十六进制数字转换为十进制数字。如果数字是二进制,则前缀为0b;如果是八进制,则前缀为0o;如果是十六进制,则前缀为0x,它会输出十进制版本。

因此,在IEx中,0b1111111的结果是127。

将十进制转换为二进制的Elixir代码:

Integer.to_string(127, 2)的结果是"1111111"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接