二进制模式匹配到列表中

bob*_*bby 2 elixir

我这样做:

<<a :: big-size(16), b :: big-size(16), c :: big-size(16)>> = <<0, 1, 0, 2, 0, 3>>
Run Code Online (Sandbox Code Playgroud)

然后结果将是:

a = 1
b = 2
c = 3
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是:

a = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一目标?

gre*_*reg 5

不直接与模式匹配.您只能匹配整个结构或子结构.你不能将一个结构强制转换为另一个结构.

还有一行代码可以帮到你:

<<a :: 16, b :: 16, c :: 16>> = <<0, 1, 0, 2, 0, 3>>
a = [a, b, c] # a equals [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

或者你可以写一个理解来做到这一点:

a = for <<b :: 16 <-  <<0, 1, 0, 2, 0, 3>> >>, do: b
Run Code Online (Sandbox Code Playgroud)


sas*_*ric 5

如果我正确地在greggreg的回答中阅读你的评论,这是一种方法:

<< size::8, rest::binary>> = <<3,0,25,1,1,2,1,6,4,3>>
<< data::size(size)-unit(16)-binary, rest::binary>> = rest
elements = for << <<element::16>> <- data>>, do: element

# At this point, elements is the list of n 16 bit integers
# (n being the first byte), and rest is the rest of the binary
Run Code Online (Sandbox Code Playgroud)