Erlang 中的二进制和位字符串有什么区别



在 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 将元组转换为二进制文件,我尝试使用位字符串语法从中解压缩某些位。为什么第一个示例有效,但第二个示例失败?看起来他们都在做非常相似的事情。

二进制

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

这种差异在这里不是您的问题。

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

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

请注意,/binary很重要,因为它将与二进制文件的残余匹配,无论其长度如何。 如果省略,匹配的长度默认为 8(即一个字节)。

您可以在 Erlang 参考手册的位语法部分阅读有关二进制文件和使用它们的更多信息。

编辑

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

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

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

相关内容

  • 没有找到相关文章

最新更新