9

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

4

2 回答 2

16

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

这种差异不是您的问题。

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

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

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

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

编辑

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

于 2012-05-30T17:24:10.707 回答
2

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

A = 300.
% Converts a number to a binary.
B = <<A:32>>.
% Converts a binary to a number.
<<A:32>> = B.
于 2017-04-10T17:31:31.857 回答