【问题标题】:Elixir: Convert list of bits to binaryElixir:将位列表转换为二进制
【发布时间】:2018-10-26 04:05:09
【问题描述】:

我有一个代表位的整数列表;例如[1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,0] 我想把它转换成二进制,即<<153, 28>>,我知道列表的长度总是8的倍数。

我查看了 Elixir 文档,但找不到任何帮助(我寻找了确切的函数,还寻找了一个用于将位附加到二进制文件的函数)。

我已经编写了一个解决问题的函数(如下),但我希望有更好的方法,因为我认为我的函数看起来太复杂了。

def list_to_binary(l) do 
  if length(l) >= 8 do
    << Enum.at(l, 0) :: size(1),
      Enum.at(l, 1) :: size(1),
      Enum.at(l, 2) :: size(1),
      Enum.at(l, 3) :: size(1),
      Enum.at(l, 4) :: size(1),
      Enum.at(l, 5) :: size(1),
      Enum.at(l, 6) :: size(1),
      Enum.at(l, 7) :: size(1)
    >> <> list_to_binary(Enum.drop l, 8)
  else
    if length(l) == 0 do
      <<>>
    else
      l = l ++ List.duplicate(0, 8 - length(l))
      list_to_binary(l)
    end
  end
end

【问题讨论】:

    标签: elixir


    【解决方案1】:

    使用Kernel.SpecialForms.for/1 理解:它是into keyword argument 接受任何实现Collectable 协议的东西,而binary 确实实现了它。

    for i <- [1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,0], do: <<i::1>>, into: <<>>
    #⇒ <<153, 28>>
    

    【讨论】:

      【解决方案2】:

      类似于上面@mudasobwa 的回答,你可以这样做

      Enum.into([1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,0], <<>>, fn bit -> <<bit :: 1>> end)
      

      我认为这稍微干净一些,因为Enum.into 可以很容易地放入管道中。

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 2021-11-14
        • 2018-06-24
        • 1970-01-01
        • 2018-01-29
        • 2017-09-27
        相关资源
        最近更新 更多