为什么从二进制字符串模式匹配生成的子串转换为整数?

时间:2016-01-10 16:23:51

标签: elixir

似乎源自模式匹配的二进制字符串的部分转换为整数:

iex(21)> <<type::size(8)>> = Base.decode16!("05")
<<5>>
iex(22)> type
5

我希望type保持纯二进制字符串,因为在所有应用程序都知道二进制代表什么类型的数据之后。

我无法找到将子字符串保留为二进制字符串的方法。这是Erlang实现的设计决定还是限制?

1 个答案:

答案 0 :(得分:5)

我不认为这种行为令人惊讶,我甚至会说它的预期。我认为这是一个设计决策而不是实施限制。

当您意识到二进制文件是什么时,这是很自然的 - 在Getting started guide

之后
  

二进制只是一个字节序列。

创建二进制文件的主要语法也显示了这个:

<<97, 98, 99, 100>>
因此,模式匹配的主要方式也是基于字节(或通常整数)的自然因此是很自然的。 幸运的是,它不是我们唯一的选择。有许多格式化程序,所有格式都记录在Kernel.SpecialForms.<<>>/1

要获得您希望的行为,您需要使用binary类型进行匹配(binary的默认单位为8位,因此您需要size(8)代替size(1) iex(3)> <<type::binary-size(1)>> = Base.decode16!("05") <<5>> iex(4)> type <<5>> }):

 MyClass myClass;