【问题标题】:Binary pattern matching into list二进制模式匹配到列表
【发布时间】:2015-02-14 06:40:36
【问题描述】:

我这样做:

<<a :: big-size(16), b :: big-size(16), c :: big-size(16)>> = <<0, 1, 0, 2, 0, 3>>

然后结果将是:

a = 1
b = 2
c = 3

但我真正需要的是:

a = [1, 2, 3]

有什么方法可以实现吗?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    如果我正确地阅读了您在 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
    

    【讨论】:

      【解决方案2】:

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

      不过,再多一行代码即可:

      <<a :: 16, b :: 16, c :: 16>> = <<0, 1, 0, 2, 0, 3>>
      a = [a, b, c] # a equals [1, 2, 3]
      

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

      a = for <<b :: 16 <-  <<0, 1, 0, 2, 0, 3>> >>, do: b
      

      【讨论】:

      • 基本上,我需要将二进制匹配到两字节整数列表中。但是列表的大小是这个二进制文件的第一个字节,所以我需要做的更动态一些。
      • 嗯,这是一个完全不同的问题,但我会试一试。
      • @greggreg 很抱歉劫持。 FWIW,我同意评论中的问题是一个不同的问题,我认为您的答案应该被接受为原始问题的正确答案。
      • @sasajuri 不用担心!!我只是喜欢回答问题,我并不关心分数。另外,我不知道 size(size)-unit(16)-binary 表单的存在并学到了一些东西!
      猜你喜欢
      • 2018-10-04
      • 1970-01-01
      • 2013-01-01
      • 2012-07-03
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多