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

Jan*_*rix 1 elixir

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

iex(21)> <<type::size(8)>> = Base.decode16!("05")
<<5>>
iex(22)> type
5
Run Code Online (Sandbox Code Playgroud)

我希望type保持一个普通的二进制字符串,因为毕竟应用程序知道二进制代表什么类型的数据.

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

mic*_*ala 5

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

当您意识到二进制文件是什么时,这很自然 - 在入门指南之后:

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

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

<<97, 98, 99, 100>>
Run Code Online (Sandbox Code Playgroud)

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

要获得您期望的行为,您需要使用binary匹配类型(默认单位为binary8位,因此不是size(8)您想要的size(1)):

iex(3)> <<type::binary-size(1)>> = Base.decode16!("05")
<<5>>
iex(4)> type
<<5>>
Run Code Online (Sandbox Code Playgroud)