【问题标题】:Argument error if I specify size for an existing bitstring when trying to build Elixir bitstring如果我在尝试构建 Elixir 位串时为现有位串指定大小,则会出现参数错误
【发布时间】:2022-08-17 18:48:36
【问题描述】:

我正在处理this exercism problem 并尝试从位串中提取 7 位,在字节的开头附加一个前导/标记位,并将两者都附加到另一个累加器位串的开头。

在此过程中,我偶然发现了一个令人困惑的错误,如果我尝试指定已经是位串的东西的大小,那么它就被称为ArgumentError,这无济于事。

这是一个例子:

iex(28)> a = <<64::size(7)>>
<<64::size(7)>>
iex(29)> b = <<1::size(1)>>
<<1::size(1)>>
iex(30)> <<b::size(1), a::size(7)>>
** (ArgumentError) argument error while evaluating iex at line 30
    (stdlib 4.0) eval_bits.erl:143: :eval_bits.eval_exp_field/6
    (stdlib 4.0) eval_bits.erl:77: :eval_bits.create_binary/2
    (stdlib 4.0) eval_bits.erl:68: :eval_bits.expr_grp/5
    (stdlib 4.0) erl_eval.erl:543: :erl_eval.expr/6
    (iex 1.13.4) lib/iex/evaluator.ex:310: IEx.Evaluator.handle_eval/3
iex(30> # of course, this works
iex(30)> <<b::bitstring, a::bitstring>>
<<192>>

为什么我不能指定位串的大小?似乎这对于捕捉意外尺寸很有用。

为什么错误消息如此无用?

  • 这应该在即将发布的 Elixir (1.14) 版本中得到改进,我得到:** (ArgumentError) construction of binary failed: segment 1 of type \'integer\': expected an integer but got: &lt;&lt;1::size(1)&gt;&gt;

标签: elixir bit-manipulation


【解决方案1】:

您正在尝试将 ::size() 约束应用于二进制文件,这显然不起作用(没有像最后一个 sn-p 那样的显式转换。)相反,您应该将它们应用于二进制内容.

iex|?|1 ▸ <<a::7>> = <<64::size(7)>>
<<64::size(7)>>
iex|?|2 ▸ <<b::1>> = <<1::size(1)>> 
<<1::size(1)>>
iex|?|3 ▸ <<a::7, b::1>>
<<129>>
iex|?|4 ▸ <<b::1, a::7>>      
<<192>>

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2019-03-02
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多