Эликсир: конвертировать список битов в двоичный - PullRequest
0 голосов
/ 16 мая 2018

У меня есть список целых чисел, представляющих биты;например, [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

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Аналогично ответу @ 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 можно легко поместить в конвейер.

0 голосов
/ 16 мая 2018

Используйте Kernel.SpecialForms.for/1 понимание: это into аргумент ключевого слова принимает все, что реализует 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>>
...