在 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
,您也可以说float
或binary
(等等)。 :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.