长生不老药:将位列表转换为二进制



我有一个表示位的整数列表;例如[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

类似于@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可以很容易地放入管道中。

使用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>>

最新更新