二元大小如何在Elixir

时间:2016-12-14 00:05:08

标签: elixir

我目前正在尝试了解binary-size(number)在Elixir中的运作方式。 在 The Little Elixir& amp; OTP指南有一节它们分解了一个128字节的ID3标签。标签具有以下属性:

  • 3字节标题
  • 30字节标题标记
  • 30字节艺术家标签
  • 30字节的专辑标签
  • 4字节年标记
  • 休息正在打包

他们在书中提取这个的方式是

<< "TAG", title :: binary-size(30), artist :: binary-size(30), album :: binary-size(30), year:: binary-size(4), _ :: binary >>

我无法理解每个值如何从binary-size(#num)获得正确的值。也许这是模式匹配发生的顺序,我很难理解。目前我正在接近它,因为我们首先模式匹配三个字节的标头,因为它被硬编码为"TAG",此时我不确定如何从binary-size(30)获取30个字节的值。此操作是否分为两个独立的部分?我们是说第一个从128,总字节大小,我们减去30然后将大小(30)的值赋给标题,然后将这个更新的大小带到二进制模式匹配中的每个值,传播任何变化吗?

1 个答案:

答案 0 :(得分:13)

我认为你可能会对Elixir的模式匹配及其使用的语法感到困惑。

首先,我知道在语法的其他任何地方都没有看到它,但它id不是binary-size(30)

基本上,它说二进制的大小是30(例如30个字节)而不是二进制减去30个字节。

例如:

binary - size(30)

所以这里我们说的是将head的值与字符串的第一个字节匹配&#34;二进制匹配字符串&#34;这意味着头部是iex(1)> string = "binary matching string" "binary matching string" iex(2)> <<head::binary-size(1), _rest::binary>> = string "binary matching string" iex(3)> head "b"

然后我们分配b以匹配二进制文件的其余部分,无论大小如何。

然而,我们并不限于严格匹配字节。由于_rest在elixir中被称为位串,如果我们不使用<< >>而只执行binary,则传入的数字以位为单位进行测量,因此sizeval::binary-size(1)(有点见下文)。

val::size(8)

为了更好地理解它,我肯定会建议打开IEX会话并输入iex(4)> <<head::size(8), _rest::binary>> = string "binary matching string" iex(5)> head 98 iex(6)> <<head>> "b" 并阅读。