Python &引用;解包需要长度为4“的字符串参数;什么时候打开浮标?

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 = ' +

我尝试使用(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 = ' + 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中没有一种简单的方法可以“填充”这个数字;也许源代码已损坏?