将二进制中的base 2数转换为Erlang整数

时间:2016-10-30 23:08:41

标签: binary numbers erlang base

假设我有一个像二进制符号表示的数字:

<br>

这是数字7的二进制表示法,在shell中评估它甚至产生7:

<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>

如何将此二进制文件转换为Erlang整数?我可以将二进制文件转换为列表,并获取其中的单个整数值,但这不适用于需要多个字节的大数字,因为列表将包含二进制文件中每个字节的项目。

3 个答案:

答案 0 :(得分:6)

使用模式匹配:

Bin = <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>,
Size = bit_size(Bin),
<<X:Size>> = Bin.

之后,变量X包含整数7.无论二进制包含多少位,这都有效。

如果您想知道,实际上有必要在匹配之前将位大小绑定到变量Size。来自the section on Bit Syntax Expressions of the Erlang Reference Manual

  

在位串构造中使用,Size是要求求值为整数的表达式。

     

用于位串匹配,Size必须是整数,或者是绑定到整数的变量。

答案 1 :(得分:3)

如果你知道你只有二进制而不是位串,即字节数是8的倍数,你可以使用binary:decode_unsigned/1

1> binary:decode_unsigned(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
7
2> binary:decode_unsigned(<<1:8, 0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
263
3> binary:decode_unsigned(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1, 0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>).
1799

答案 2 :(得分:1)

一种方法是使用二进制理解通过添加$0将每个位单独转换为其等效字符,然后将生成的二进制文件传递给binary_to_integer/2进行转换,将其数字基数指定为2 :

1> binary_to_integer(<< <<(X+$0)>> || <<X:1>> <= <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>> >>, 2).
7
2> binary_to_integer(<< <<(X+$0)>> || <<X:1>> <= <<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1, 0:4, 1:1, 0:1, 1:1, 0:1>> >>, 2).
1802

第二个示例显示了一个较长的二进制文件,其中包含十六进制16#70A或二进制2#11100001010的值,两者都等于十进制值1802。