似乎源自模式匹配的二进制字符串的部分转换为整数:
iex(21)> <<type::size(8)>> = Base.decode16!("05")
<<5>>
iex(22)> type
5
我希望type
保持纯二进制字符串,因为在所有应用程序都知道二进制代表什么类型的数据之后。
我无法找到将子字符串保留为二进制字符串的方法。这是Erlang实现的设计决定还是限制?
答案 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;