将二进制中的基数 2 转换为 Erlang 整数
Convert base 2 number in a binary to an Erlang integer
假设我有一个像这样用二进制表示法表示的数字:
<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>
这是数字 7 的二进制表示法,在 shell 中计算它甚至会产生 7:
<<7>>
如何将此二进制文件转换为 Erlang 整数?我可以将二进制文件转换为列表,并在其中获取单个整数值,但这对需要多个字节的大数字不起作用,因为列表将包含二进制文件中每个字节的项目。
使用模式匹配:
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:
Used in a bit string construction, Size is an expression that is to evaluate to an integer.
Used in a bit string matching, Size must be an integer, or a variable bound to an integer.
一种方法是使用二进制理解通过添加 [=11=]
将每个位单独转换为其等效字符,然后将生成的二进制传递给 binary_to_integer/2
进行转换,指定其数字基数作为 2:
1> binary_to_integer(<< <<(X+[=10=])>> || <<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+[=10=])>> || <<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。
如果您知道您只有二进制文件而不是位串,即字节数将是 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
假设我有一个像这样用二进制表示法表示的数字:
<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 1:1, 1:1>>
这是数字 7 的二进制表示法,在 shell 中计算它甚至会产生 7:
<<7>>
如何将此二进制文件转换为 Erlang 整数?我可以将二进制文件转换为列表,并在其中获取单个整数值,但这对需要多个字节的大数字不起作用,因为列表将包含二进制文件中每个字节的项目。
使用模式匹配:
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:
Used in a bit string construction, Size is an expression that is to evaluate to an integer.
Used in a bit string matching, Size must be an integer, or a variable bound to an integer.
一种方法是使用二进制理解通过添加 [=11=]
将每个位单独转换为其等效字符,然后将生成的二进制传递给 binary_to_integer/2
进行转换,指定其数字基数作为 2:
1> binary_to_integer(<< <<(X+[=10=])>> || <<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+[=10=])>> || <<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。
如果您知道您只有二进制文件而不是位串,即字节数将是 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