Erlang浮点数和整数的二进制表示,存在差异?

3

我最近在阅读有关Erlang二进制表示的内容,并需要实现二进制协议。以下是另一个Erlang二进制表示方面的问题。

如果我正确理解类型说明符,那么对于“float”类型值,8字节表示似乎很好(这是在64位Win7上的情况)。

1> <<A1/binary>> = <<12.3214/float>>.
<<64,40,164,142,138,113,222,106>>

然而,让我困惑的是,“整数”类型值的二进制表示。
2> <<A2/binary>> = <<32512/integer>>.
<<0>>
3> <<A3/binary>> = <<232512518/integer>>.
<<6>>
4> <<A5/binary>> = <<80/integer>>.
<<"P">>

为什么所有这些都用1字节表示?有人可以解释一下吗?
1个回答

10

你没有将Erlang术语转换为它们的二进制表示形式。你是在使用二进制语法来构建二进制数据。使用整数会将它们截断以适合一个字节:

3> <<255/integer>>. % Under one byte
<<"ÿ">>
4> <<256/integer>>. % "Over" one byte
<<0>>

试试这个:

5> term_to_binary(32512).
<<131,98,0,0,127,0>>
6> term_to_binary(232512518).
<<131,110,4,0,6,220,219,13>>
7> term_to_binary(80).
<<131,97,80>>
< p > 131 是版本号,97 是一个小整数(8位),98 是一个大整数(32位),110 (和 111)用于大整数。其余的是实际数字的数据。

请参阅Erlang二进制术语格式文档以获取有关这些字节意义的更多信息。


谢谢您的解释。今天是我比较慢的一天,请耐心等待。当我们写<<255/integer>>时,就像明确表示我们指的是数字255作为8位(无符号)整数。这就解释了为什么我可以做这些——<<255:16/integer>>和<<255:32/integer>>,将它们转换为显式的2字节和4字节小端表示,并且可能有用于直接处理CAN总线数据(即小端)。也许不是一个好主意?我希望利用二进制表示来填充协议头。 - bdutta74
1
在处理二进制协议时,您应该按照这种方式进行操作。这就是您将如何使用不同大小的整数在Erlang中创建二进制文件的方式。Erlang二进制术语格式是完全不同的,用于在Erlang节点或其他使用“Erlang”进行通信的系统之间进行通信。请参见http://bert-rpc.org/。 - Adam Lindberg
1
@icarus74:如果您只指定例如<<N:32/integer>>,则默认为大端序而不是小端序(许多协议使用大端序=网络字节顺序)。但是,您可以指定大小端或本机的字节顺序。请参见http://www.erlang.org/doc/reference_manual/expressions.html#id77409。 - Peer Stritzinger
@peer-stritzinger 感谢您的评论。当我执行 -- 1> <<B6/binary>> = <<3100:64/integer>>. 它返回 -- <<0,0,0,0,0,0,12,28>> - bdutta74
1
@icarus 但是你的例子展示了大端编码,请参考http://en.wikipedia.org/wiki/Endianness。 - Peer Stritzinger
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接