在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将元组转换为二进制,并尝试使用位串语法从其中解压某些位。为什么第一个示例可以工作,而第二个示例失败?看起来他们都在做非常相似的事情。
发布于 2012-05-31 01:24:11
二进制和位串的不同之处在于,二进制的长度可以被8整除,即它不包含“部分”字节;位串没有这样的限制。
在这里,这种差异不是您的问题。
你面临的问题是你的语法是错误的。如果您想从二进制文件中提取前32位,则需要编写一条完整的匹配语句,如下所示:
<<B1:32, _/binary>> = B.请注意,/binary很重要,因为无论其长度如何,它都将与二进制的残差相匹配。如果省略,匹配长度默认为8(即一个字节)。
您可以阅读有关二进制文件以及在Erlang Reference Manual's section on bit syntax中使用它们的更多信息。
编辑
在您的评论中,<<A:32>>不仅仅适用于整数,它也适用于值。根据我给出的链接,位语法允许您指定二进制匹配的许多方面,包括绑定变量的数据类型-虽然默认类型是integer,但您也可以使用float或binary (以及其他)。:32部分指出匹配需要32位-这可能有意义,也可能没有意义,这取决于您的数据类型,但这并不意味着它只对整数有效。例如,您可以使用<<Bits:10/bitstring>>来描述一个10位的位串。希望这能有所帮助!
发布于 2017-04-11 01:31:32
<<A:32>>语法构造一个二进制文件。要解构二进制文件,您需要将其用作模式,而不是将其用作表达式。
A = 300.
% Converts a number to a binary.
B = <<A:32>>.
% Converts a binary to a number.
<<A:32>> = B.https://stackoverflow.com/questions/10820971
复制相似问题