我一直在尝试将一组2个16位整数转换为单个32位浮点数。这是我在MODBUS通信协议上的工作。 我的查询与提到的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 OS驱动的Beagle Bone Black板上运行此代码。
我哪里错了?
答案 0 :(得分:6)
您需要在解包调用中指定字节顺序。
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)
当然,键入更多一点,但它使您的代码更容易阅读和维护。