python : Convert 2 ints to float

标签 python floating-point pack unpack modbus

我一直在尝试将一组 2 个 16 位整数转换为一个 32 位 float 。这是我在 MODBUS 通信协议(protocol)方面的工作。 我的查询与提到的相同 here

但是,当我按照那里提供的打包/解包方法时,我没有得到类似的结果。

这是我的测试程序:

from struct import *

tup=(16256, 0)

print hex(tup[0])
print hex(tup[1])

mypack = pack('>HH',tup[0],tup[1])
print mypack

f = unpack('f', mypack)[0]
print f

输出如下:

0x3f80
0x0
?
4.60060298822e-41

我希望最终输出实际上只是“1.0”,因为“0x3F800000”的浮点解释就是这样!

我在由 Debian 操作系统提供支持的 Beagle Bone Black 板上运行此代码。

我哪里错了?

最佳答案

您需要在解包调用中指定字节顺序。

from struct import *

tup=(16256, 0)

print hex(tup[0])
print hex(tup[1])

mypack = pack('>HH',tup[0],tup[1])
print `mypack`

f = unpack('>f', mypack)
print f

输出

0x3f80
0x0
'?\x80\x00\x00'
(1.0,)

但请记住您链接到的问题中提到的警告/注意事项,尤其是与 NaN 有关的警告/注意事项。

另请注意,执行 from modulename import * 通常被认为是不好的做法,因为它会将 modulename 中的名称转储到您的脚本命名空间中。这很困惑,并且可能导致错误。所以最好做

import struct

#...

mypack = struct.pack('>HH',tup[0],tup[1])
f = struct.unpack('>f', mypack)

当然,它的输入有点多,但它使您的代码更易于阅读和维护。

关于 python : Convert 2 ints to float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28186746/

相关文章:

python - 无法导入模块 'lambda_function' : No module named 'mysql'

Python OOP 实例和类的可变性

python - 增强DataFrame索引

c++ - visual studio 2010 在 float /双增量上显示奇怪的行为

java - 为什么在 Java 中存储为 float 和 double 的相同值之间存在差异?

java - 在 Java 中将字符串转换为字节

python - scikit-learn 可以处理多少功能?

parsing - Bison 语法中的浮点被截断

java - 将哈希函数从 php 重写为 java - 其他结果

列表中单个元素的 Python struct.pack()?