浮点数的整数类型错误:找到非十六进制数字

露西安


我正在尝试将浮点数转换为long并返回,以查看如何通过套接字发送它。我制作了FloatToInt方法只是为了测试无法反序列化的数字。
将其从float转换为long时,它可以正常工作,但是当我尝试将其从long转换为float时,它会抛出“找到非十六进制数字”

def FloatToInt(num):
    num = 22083.60066068796
    print "FloatToInt:float:%.10f" %num 
    packed = struct.pack('!f', num)
    print 'FloatToInt:Packed: %s' % repr(packed)
    integers = [ord(c) for c in packed]
    print 'FloatToInt:Integers: %s' % repr(integers)
    val = int(0)
    for i in integers:
        val |= i
        val = val << 8
    return val

def IntToFloat(num):
    #val = struct.unpack('!f', num.decode('hex'))[0]
    #return val
    intArr = []
    while num > 0:
        val = num & 0xFF
        if val > 0:
            intArr.append(int(val))
        num = num >> 8
    print 'IntToFloat:Integers: %s' % repr(intArr)
    chars = [chr(c) for c in intArr]
    str = ""
    for ch in chars:
        str += ch
    print 'IntToFloat:Hex chars: %s' % repr(str)
    ret = struct.unpack('!f', str.decode('hex'))[0]
    return ret

输出:

FloatToInt:float:22083.6006606880
FloatToInt:打包:'F \ xac \ x874'FloatToInt
:Integers:[

70,172,135,52 ] IntToFloat:Integers:[
52,135,172,70 ] IntToFloat:Hex字符:'4 \ x87 \ xacF'Traceback

(最近一次通话最近):
........
TypeError:找到了非十六进制数字

因此,尽管我具有与在FloatToInt方法中打包值时相同的整数值,但是str.decode('hex')引发了错误。
您对我缺少的想法有什么想法吗?
谢谢

简单的

decode('hex')用于解码这样的字符串'0487AC0F'

print( '0487AC0F'.decode('hex') )

但是您不需要decode()代码。您只需要反转元素intArr即可获得正确的结果。

顺便提一句。float通过套接字发送,您只需要pack/ unpack-不必创建long int-因为套接字只能发送字符串或字节。long int通过套接字发送,您将需要pack/unpack将其转换为字符串/字节。

import struct

def FloatToInt(num):
    num = 22083.60066068796
    print "FloatToInt:float:%.10f" %num

    packed = struct.pack('!f', num)
    print 'FloatToInt:Packed: %s' % repr(packed)

    integers = [ord(c) for c in packed]
    print 'FloatToInt:Integers: %s' % repr(integers)

    val = int(0)
    for i in integers:
        val |= i
        val = val << 8

    return val

def IntToFloat(num):
    intArr = []

    while num > 0:
        val = num & 0xFF
        if val > 0:
            intArr.append(val)
        num = num >> 8

    # you have to reverse numbers
    intArr = list(reversed(intArr))

    print 'IntToFloat:Integers: %s' % repr(intArr)

    text = "".join([chr(c) for c in intArr])
    #chars = [chr(c) for c in intArr]
    #text = ""
    #for ch in chars:
    #    text += ch

    print 'IntToFloat:Hex chars: %s' % repr(text)

    # you don't need decode('hex')
    ret = struct.unpack('!f', text)[0]

    return ret

num = 22083.60066068796
r = FloatToInt(num)
print '   FloatToInt:', r 
r = IntToFloat(r) 
print '   IntToFloat:', r

编辑: Python使用CPU浮动,但它有两种类型

  • 单精度-称为“浮动”
  • 双精度-称为“双精度”

它在此示例中接缝了Python使用“ double”,因此您可以使用!d代替!f获得正确的值

import struct

num = 22083.60066068796
print "   float: %.10f" % num

packed = struct.pack('!d', num)
print '  packed: %s' % repr(packed)

ret = struct.unpack('!d', packed)[0]
print "unpacked: %.10f" %num

   float: 22083.6006606880
  packed: '@\xd5\x90\xe6q9\x86\xb2'
unpacked: 22083.6006606880

"double" 在之前的代码中

 import struct

def FloatToInt(num):

    print "FloatToInt:    float: %.10f" % num

    packed = struct.pack('!d', num)
    print 'FloatToInt:   Packed: %s' % repr(packed)

    integers = [ord(c) for c in packed]
    print 'FloatToInt: Integers: %s' % integers

    val = int(0)
    for i in integers:
        val |= i
        val = val << 8

    print 'FloatToInt:   result: %d\n' % val

    return val

def IntToFloat(num):

    print 'IntToFloat:  integer: %d\n' % num

    intArr = []

    while num > 0:
        val = num & 0xFF
        if val > 0:
            intArr.append(val)
        num = num >> 8

    intArr = list(reversed(intArr))

    print 'IntToFloat: Integers: %s' % intArr

    text = "".join([chr(c) for c in intArr])
    print 'IntToFloat:Hex chars: %s' % repr(text)

    ret = struct.unpack('!d', text)[0]
    print 'IntToFloat:   result: %.10f\n' % ret

    return ret

num = 22083.60066068796
r = FloatToInt(num)
r = IntToFloat(r)

FloatToInt:    float: 22083.6006606880
FloatToInt:   Packed: '@\xd5\x90\xe6q9\x86\xb2'
FloatToInt: Integers: [64, 213, 144, 230, 113, 57, 134, 178]
FloatToInt:   result: 1195980674018107109888

IntToFloat:  integer: 1195980674018107109888
IntToFloat: Integers: [64L, 213L, 144L, 230L, 113L, 57L, 134L, 178L]
IntToFloat:Hex chars: '@\xd5\x90\xe6q9\x86\xb2'
IntToFloat:   result: 22083.6006606880

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将数字(也可以是浮点数)转换为十六进制,反之亦然

PHP将十六进制转换为浮点数

将十六进制转换为浮点数

打印浮点数的内部十六进制

将浮点数表示为十六进制

将浮点数转换为十六进制格式

将十六进制编码的浮点数解码为本机浮点值

在Javascript中将64位十六进制转换为十进制浮点数

Python如何将浮点数十六进制转换为十进制

Hibernate MS-SQL错误的列类型找到:十进制,预期:浮点数

如何将十六进制转换为浮点数

C ++将4个十六进制值转换为浮点数

如何在python中将十六进制值转换为浮点数

Powershell-符合IEEE754单精度浮点数的十六进制

如何用字符串,浮点数解析十六进制

“ p”在浮点数的指数十六进制表示法中代表什么

从十六进制哈希生成范围内的浮点数

将十六进制字符串中的负数解码为浮点数?

Java浮点数表示为十六进制数

如何在Perl中将浮点数转换为十六进制字符串?

将十六进制转换为C中的浮点数

GDB可以正确解析C样式的十六进制浮点数吗?

十六进制字符串表示形式到python中的浮点数

十六进制转换为浮点数-JS中的Big Endian(ABCD)

Float24(24位浮点数)转换为十六进制?

将十六进制文件转换为php中的浮点数

如何将十六进制切片转换为带二进制补码的浮点数

为什么mpfr_printf与printf的十六进制浮点数(%a转换说明符)不同?

十六进制的非法整数字符

TOP 榜单

热门标签

归档