gpt4 book ai didi

erlang - Erlang 中的二进制和位串有什么区别?

转载 作者:行者123 更新时间:2023-12-02 05:44:45 32 4
gpt4 key购买 nike

在 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 Reference Manual's section on bit syntax 中阅读有关二进制文件及其使用的更多信息。 .

编辑

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

关于erlang - Erlang 中的二进制和位串有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820971/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com