Python &引用;解包需要长度为4“的字符串参数;什么时候打开浮标?
我尝试使用(Python 2.7)以下方法将十六进制值转换为浮点值:Python &引用;解包需要长度为4“的字符串参数;什么时候打开浮标?,python,hex,css-float,Python,Hex,Css Float,我尝试使用(Python 2.7)以下方法将十六进制值转换为浮点值: def hex2float(x): y = 0 z = x.decode('hex') try: y = struct.unpack('!f', z)[0] except: print sys.exc_info()[1] print 'z = ' + z print 'y = %s' % (y) print 'x = ' +
def hex2float(x):
y = 0
z = x.decode('hex')
try:
y = struct.unpack('!f', z)[0]
except:
print sys.exc_info()[1]
print 'z = ' + z
print 'y = %s' % (y)
print 'x = ' + x
return
def foo28():
x = '615885' #8.9398e-039
hex2float(x)
结果如下:
unpack requires a string argument of length 4
z = aXà
y = 0
x = 615885
我注意到,对于非常小的值,我得到了异常消息。在这种情况下,是否有合适的方法将十六进制值转换为浮点值。您需要四个字节才能解包,因此,如果需要,请预先发送空字节:
z = x.decode('hex')
z = '\0' * (4 - len(z)) + z
通常情况下,str.decode
只输出表示值所需的字节数,这就是为什么您只看到小值出现这种情况的原因
这非常有效:
>>> z = '615885'.decode("hex")
>>> z = '\0' * (4 - len(z)) + z
>>> struct.unpack('!f', z)
(8.939797951825212e-39,)
如果你也要做双倍运算,这个解决方案仍然有效,只需将
4
更改为8
是,因为你需要4个字节来获得表示浮点的32位(对于32位浮点)。据我所知,在IEEE-754中没有一种简单的方法可以“填充”这个数字;也许源代码已损坏?