二元大小如何在Elixir中工作

cog*_*gle 6 elixir

我目前正在努力了解binary-size(number)Elixir的工作原理.在The Little Elixir&OTP Guidebook的例子中,有一节中它们分解了一个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 >>
Run Code Online (Sandbox Code Playgroud)

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

Har*_*cas 14

我想你可能会对Elixir如何进行模式匹配及其使用的语法感到困惑.

首先我知道它在语法的其他地方并没有真正被看到,但事实binary-size(30)并非如此binary - size(30).

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

例如:

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"
Run Code Online (Sandbox Code Playgroud)

所以这里我们说head匹配字符串"二进制匹配字符串"的第一个字节,这意味着head是b.

然后我们分配_rest匹配二进制的其余部分,无论大小.

但是,我们不限于严格匹配字节.因为<< >>在elixir中称为位串,如果我们离开binary并且只是这样做size,传入的数字是以位为单位测量的,因此它们val::binary-size(1)是相同的val::size(8)(好的,见下文).

iex(4)> <<head::size(8), _rest::binary>> = string
"binary matching string"
iex(5)> head
98
iex(6)> <<head>>
"b"
Run Code Online (Sandbox Code Playgroud)

为了更好地理解它,我肯定会建议打开一个IEX会话并输入h <<>>和阅读.