gpt4 book ai didi

elixir - 二进制大小如何在 Elixir 中工作

转载 作者:行者123 更新时间:2023-12-04 10:06:55 25 4
gpt4 key购买 nike

我目前正试图了解如何 binary-size(number)在 Elixir 中工作。
在来自 的示例中Little Elixir 和 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) 获得正确的值.也许这是模式匹配发生的顺序,我很难理解。目前我正在接近它,因为我们首先模式匹配三个字节的 header ,因为它被硬编码为 "TAG" ,此时我不确定我们如何从 binary-size(30) 获取 30 字节的值.此操作是否被拆分为两个独立的部分?我们是说首先从 128 总字节大小中减去 30,然后将 size(30) 的值分配给标题,然后将此更新后的大小传递给二进制模式匹配中的每个值,从而传播任何变化吗?

    最佳答案

    我认为您可能对 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"

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

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

    然而,我们不限于严格匹配字节。自 << >>如果我们省略 binary,在 elixir 中被称为位串就做 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"

    为了更好地理解它,我绝对建议打开一个 IEX session 并输入 h <<>>并通读一遍。

    关于elixir - 二进制大小如何在 Elixir 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132669/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com