【问题标题】:Pad binaries in elixir by a variable amount以可变数量填充 elixir 中的二进制文件
【发布时间】:2017-07-05 03:43:48
【问题描述】:

我需要一个可以生成包含一定数量的 0 八位字节的二进制文件的函数。我虽然以下是可能的

def padding(length) do
  bits = length * 8
  <<0::bits>>
end

def padding(length) do
  <<0::binary-size(length)>>
end

这两个都因参数错误而失败。为什么在 elixir 中传递一个变量来创建二进制文件是不通的。从这个链接看起来像在erlang中是可能的。 http://erlang.org/pipermail/erlang-questions/2008-December/040703.html

还有什么是在 Elixir 中实现这个功能的简单方法

【问题讨论】:

    标签: binary elixir


    【解决方案1】:

    你快到了。您的第一次尝试需要明确的size() 才能工作:

    iex(1)> length = 5
    5
    iex(2)> bits = length * 8
    40
    iex(3)> <<0::size(bits)>>
    <<0, 0, 0, 0, 0>>
    

    我认为没有办法使用::binary-size(N) 创建这个二进制文件。您链接到的 Erlang 邮件列表线程也在构建二进制文件之前将字节数乘以 8。 Elixir 只是不允许像 Erlang 那样在 size() 中使用表达式。

    您也可以使用:binary.copy/2,但我不确定这是否与上述一样有效:

    iex(4)> :binary.copy(<<0>>, 5)
    <<0, 0, 0, 0, 0>>
    

    【讨论】:

    • 看起来不错,虽然我仍然很好奇为什么 elixir 不允许表达式而 erlang 允许表达式的历史
    • @PeterSaxton 根本原因是here。我无法想出为什么size 接受变量并且unit 明确要求整数项的原因:len = 8; &lt;&lt;0::size(len)-unit(8)&gt;&gt; 有效,而len = 8; &lt;&lt;0::size(len)-unit(len)&gt;&gt; 在我上面链接的代码的第 178 行中失败。此外,&lt;&lt;0::8*5&gt;&gt; 有效,而 &lt;&lt;0::len*5&gt;&gt;&lt;&lt;0::8*len&gt;&gt; 均无效。
    • 是的,我也很困惑为什么 Elixir 不支持这个,因为那个邮件列表帖子是从 2008 年开始的,这意味着 Erlang 早在 Elixir 首次提交之前就已经支持了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2019-05-19
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多