32位hex转浮点 python_python 32位浮点转换

Redhat6.3上的Python2.6

我有一个设备,它在两个内存寄存器中保存32位浮点值,分成最重要的字和最不重要的字。

我需要把它转换成一个浮点数。

我一直在使用SO上找到的以下代码,它与我在其他地方看到的代码类似#!/usr/bin/env python

import sys

from ctypes import *

first = sys.argv[1]

second = sys.argv[2]

reading_1 = str(hex(int(first)).lstrip("0x"))

reading_2 = str(hex(int(second)).lstrip("0x"))

sample = reading_1 + reading_2

def convert(s):

i = int(s, 16) # convert from hex to a Python int

cp = pointer(c_int(i)) # make this into a c integer

fp = cast(cp, POINTER(c_float)) # cast the int pointer to a float pointer

return fp.contents.value # dereference the pointer, get the float

print convert(sample)

寄存器值的示例如下:

寄存器1;16282寄存器2;60597

这就产生了

1.21034872532号

一个完美的cromultent数,但是有时内存值是这样的

寄存器1;16282寄存器2;1147

使用这个函数会产生一个浮点数

1.46726675314e-36

这是一个非常小的数字,而不是一个看起来正确的数字。这个装置应该在1.2,1.3范围内产生读数。

我试图解决的问题是,设备是否抛出了虚假的值,或者我得到的值是否正确,但我使用的函数无法正确转换它们。

还有什么更好的方法可以做到这一点,比如用纽比或者其他类似的东西?

我将举起手来,说我刚刚从网上的示例中复制了这段代码,我对它的工作原理知之甚少,但是它似乎在我当时可用的测试用例中工作。

谢谢你。

如果你想将一个浮点数的指数位和尾数位分别转换成整数,可以使用 Python 内置的 struct 模块。 下面是一个示例代码,将一个浮点数的指数位和尾数位分别转换成 int 型: ```python import struct x = 3.14 bytes_x = struct.pack('d', x) # 将浮点数转换成 bytes 类型 hex_x = bytes_x.hex() # 将 bytes 类型转换成十六进制字符串 sign = int(hex_x[0], 16) >> 7 # 获取符号位,右移 7 位 exponent = int(hex_x[0:2], 16) & 0x7ff # 获取指数位,取二进制与操作 mantissa = int(hex_x[2:], 16) # 获取尾数位 if exponent == 0x7ff: # 如果指数位全为 1,表示该浮点数为 NaN 或无穷大 if mantissa == 0: print('该浮点数为 NaN') else: print('该浮点数为无穷大') else: # 否则,根据指数位和尾数位计算浮点数的值 value = (-1) ** sign * (1 + mantissa / 2 ** 52) * 2 ** (exponent - 1023) print('该浮点数的值为', value) exponent_int = exponent - 1023 # 将指数位转换为 int 型 mantissa_int = mantissa # 将尾数位转换为 int 型 print('指数位的 int 值为', exponent_int) print('尾数位的 int 值为', mantissa_int) ``` 在上面的代码中,我们首先使用 struct.pack() 函数将浮点数转换成 bytes 类型,然后将 bytes 类型转换成十六进制字符串。接着,我们从十六进制字符串中获取符号位、指数位和尾数位,并根据它们计算浮点数的值。最后,我们将指数位和尾数位分别转换成 int 型,并输出它们的值。 需要注意的是,上面的代码仅适用于 IEEE 754 标准的双精度浮点数。如果你需要处理其他类型的浮点数,需要根据相应的规范进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值