首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang中的二进制和Bitstring有什么区别?

Erlang中的二进制和Bitstring有什么区别?
EN

Stack Overflow用户
提问于 2012-05-31 01:08:25
回答 2查看 6K关注 0票数 8

在Erlang shell中,我可以执行以下操作:

代码语言:javascript
复制
A = 300.
    300
<<A:32>>.
    <<0, 0, 1, 44>>

但当我尝试以下操作时:

代码语言:javascript
复制
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将元组转换为二进制,并尝试使用位串语法从其中解压某些位。为什么第一个示例可以工作,而第二个示例失败?看起来他们都在做非常相似的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 01:24:11

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

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

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

代码语言:javascript
复制
<<B1:32, _/binary>> = B.

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

您可以阅读有关二进制文件以及在Erlang Reference Manual's section on bit syntax中使用它们的更多信息。

编辑

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

票数 15
EN

Stack Overflow用户

发布于 2017-04-11 01:31:32

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

代码语言:javascript
复制
A = 300.
% Converts a number to a binary.
B = <<A:32>>.
% Converts a binary to a number.
<<A:32>> = B.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10820971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档