似乎源自模式匹配的二进制字符串的部分转换为整数:
iex(21)> <<type::size(8)>> = Base.decode16!("05")
<<5>>
iex(22)> type
5
Run Code Online (Sandbox Code Playgroud)
我希望type
保持一个普通的二进制字符串,因为毕竟应用程序知道二进制代表什么类型的数据.
我无法找到将子字符串保留为二进制字符串的方法.它是Erlang实现的设计决策还是限制?
我不认为这种行为令人惊讶,我甚至会说它是预料之中的.我认为这是一个设计决策而不是实施限制.
当您意识到二进制文件是什么时,这很自然 - 在入门指南之后:
二进制只是一个字节序列.
创建二进制文件的主要语法也展示了这个:
<<97, 98, 99, 100>>
Run Code Online (Sandbox Code Playgroud)
因此,模式匹配的主要方式也是基于字节(或通常为整数)的自然.幸运的是,这不是我们唯一的选择.有许多格式化程序,所有格式都记录在案Kernel.SpecialForms.<<>>/1
.
要获得您期望的行为,您需要使用binary
匹配类型(默认单位为binary
8位,因此不是size(8)
您想要的size(1)
):
iex(3)> <<type::binary-size(1)>> = Base.decode16!("05")
<<5>>
iex(4)> type
<<5>>
Run Code Online (Sandbox Code Playgroud)