【问题标题】:What is the difference between a Binary and a Bitstring in Erlang?Erlang中的二进制和位串有什么区别?
【发布时间】:2012-05-30 17:08:24
【问题描述】:

在 Erlang shell 中,我可以执行以下操作:

A = 300.
    300
<<A:32>>.
    <<0, 0, 1, 44>>

但是当我尝试以下操作时:

B = term_to_binary({300}).
    <<131,104,1,98,0,0,1,44>>
<<B:32>>
    ** exception error: bad argument
<<B:64>>
    ** exception error: bad argument

在第一种情况下,我采用整数并使用位串语法将其放入 32 位字段。这按预期工作。在第二种情况下,我使用term_to_binary BIF 将元组转换为二进制,我尝试使用位串语法从中解压缩某些位。为什么第一个示例有效,但第二个示例失败?看起来他们都在做非常相似的事情。

【问题讨论】:

    标签: erlang binary-data bitstring


    【解决方案1】:

    二进制和位串的区别在于二进制的长度可以被 8 整除,即它不包含“部分”字节;位串没有这样的限制。

    这个区别不是你的问题。

    您面临的问题是您的语法错误。如果您想从二进制文件中提取前 32 位,则需要编写一个完整的匹配语句 - 如下所示:

    <<B1:32, _/binary>> = B.
    

    请注意,/binary 很重要,因为无论其长度如何,它都会匹配二进制文件的剩余部分。如果省略,则匹配长度默认为 8(即 1 个字节)。

    您可以在Erlang Reference Manual's section on bit syntax 中阅读有关二进制文件和使用它们的更多信息。

    编辑

    对于您的评论,&lt;&lt;A:32&gt;&gt; 不仅适用于整数,还适用于 值。根据我给出的链接,位语法允许您指定二进制匹配的许多方面,包括绑定变量的数据类型 - 而默认类型是 integer,您也可以说 float 或 binary(等等) . :32 部分表示匹配需要 32 位 - 根据您的数据类型,这可能有意义也可能没有意义,但这并不意味着它仅对整数有效。例如,您可以说&lt;&lt;Bits:10/bitstring&gt;&gt; 来描述一个 10 位的位串。希望对您有所帮助!

    【讨论】:

    • 那么&lt;&lt;A:32&gt;&gt; 语法是否只对整数有效?
    【解决方案2】:

    &lt;&lt;A:32&gt;&gt; 语法构造二进制文件。要解构二进制文件,您需要将其用作模式,而不是将其用作表达式。

    A = 300.
    % Converts a number to a binary.
    B = <<A:32>>.
    % Converts a binary to a number.
    <<A:32>> = B.
    

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2016-02-14
      • 2016-05-17
      • 2016-08-12
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多