Python:将2个int转换为float

JDD*_*JDD 2 python floating-point modbus unpack pack

我一直在尝试将一组2个16位整数转换为单个32位浮点数.这是我在MODBUS通信协议上的工作.我的查询与此处提到的相同

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

这是我的测试程序:

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
Run Code Online (Sandbox Code Playgroud)

输出如下:

0x3f80
0x0
?
4.60060298822e-41
Run Code Online (Sandbox Code Playgroud)

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

我在由Debian OS驱动的Beagle Bone Black板上运行此代码.

我哪里错了?

PM *_*ing 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
Run Code Online (Sandbox Code Playgroud)

产量

0x3f80
0x0
'?\x80\x00\x00'
(1.0,)
Run Code Online (Sandbox Code Playgroud)

但请记住您所关联的问题中提到的警告/警告,特别是那些与NaN有关的警告/警告.

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

import struct

#...

mypack = struct.pack('>HH',tup[0],tup[1])
f = struct.unpack('>f', mypack)
Run Code Online (Sandbox Code Playgroud)

当然,键入更多一点,但它使您的代码更容易阅读和维护.