qua*_*cle 7 erlang binary-data bitstring
在Erlang shell中,我可以执行以下操作:
A = 300.
300
<<A:32>>.
<<0, 0, 1, 44>>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试以下内容时:
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
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我采用整数并使用bitstring语法将其放入32位字段.这按预期工作.在第二种情况下,我使用term_to_binary
BIF将元组转换为二进制,我尝试使用bitstring语法解压缩某些位.为什么第一个例子有效,但第二个例子失败了?看起来他们都做了非常相似的事情.
Ben*_*Ben 14
二进制和位串之间的区别在于二进制的长度可以被8整除,即它不包含'部分'字节; bittring没有这样的限制.
这种差异不是你的问题.
您遇到的问题是您的语法错误.如果要从二进制文件中提取前32位,则需要编写完整的匹配语句 - 如下所示:
<<B1:32, _/binary>> = B.
Run Code Online (Sandbox Code Playgroud)
请注意,这/binary
很重要,因为它将匹配二进制的残余,无论其长度如何.如果省略,匹配的长度默认为8(即一个字节).
您可以在Erlang Reference Manual的位语法部分中阅读有关二进制文件的更多信息并使用它们.
编辑
对于你的评论,<<A:32>>
不仅仅是整数,而是价值观.根据我给出的链接,位语法允许您指定二进制匹配的许多方面,包括绑定变量的数据类型 - 虽然默认类型是integer
,您也可以说float
或binary
(等等).该:32
部分表示匹配需要32位 - 根据您的数据类型可能有意义也可能没有意义,但这并不意味着它仅对整数有效.例如,您可以说<<Bits:10/bitstring>>
要描述一个10位的位串.希望有所帮助!