Python中的十六进制转浮点数

3

我正在从一个二进制文件中读取数据。我有一个文档告诉我信息是如何存储的。为了确保这一点,我使用XVI32。

我正确地提取了字符串和整数数据,直到遇到浮点数据类型。

根据这个文件:

00800000 = 0.0
7AFBDD35 = 0.061087
9BF7783C = -0.003491
00FBFCAD = 0.031416

我尝试用以下方法解决:

struct.unpack('!f', my_float.decode('hex'))[0]

还有其他不同的方法...

我用一些在线工具测试了这个信息,例如:http://babbage.cs.qc.cuny.edu/IEEE-754/index.xhtmlhttp://www.binaryconvert.com/result_float.html?decimal=048046048054049048056055,但所有这些方式都给我一个与原始结果不同的值。

我开始怀疑浮点信息是否被加密了或类似的东西,但为什么字符串和整数没有被加密呢?


1
你能提供更多的例子吗?你展示的这几个很难看出规律。 - Ignacio Vazquez-Abrams
4
等等,文档真的只给了这四个例子,就期望从中清晰地得出模式吗?它没有提及其他标准或任何内容吗? - Karl Knechtel
7AFBDD35中,7A显然是没有符号位的指数。但在其他情况下它不起作用。你确定它们是正确的吗? - Timothy
如果字节在单词中被交换,则指数看起来像是128的偏移量,而尾数中的符号位也会受到影响。无论如何,我仍然无法理解尾数。 - starbolin
TMS320浮点数文档在此处:ti.com/lit/an/spra400/spra400.pdf,正如我在对OP的评论中所说,前两个十六进制数字是指数。但是,0.031416的指数怎么可能是“00”?我必须再次询问:你确定它们是正确的吗?你是在玩我们吗? - Timothy
显示剩余2条评论
2个回答

2

有趣的谜题。在使用文档时,我得出了以下结论:

def byteswap(x):
    return ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8)


def tms320_float(raw):
    s = (raw >> 23) & 1
    mantissa = (raw & 0x007fffff)
    exponent = raw >> 24
    if exponent >= 128:
        exponent -= 256
    if exponent == -128:
        return 0.0
    return (((-2) ** s) + float(mantissa) / float(1 << 23)) * (2.0 ** exponent)

>>> tms320_float(byteswap(0x00800000))
0.0
>>> tms320_float(byteswap(0x7AFBDD35))
0.06108652427792549
>>> tms320_float(byteswap(0x9BF7783C))
-0.003490658476948738
>>> tms320_float(byteswap(0x00FBFCAD))
0.031415924429893494

每天我在stackoverflow.com上发现了许多编程水平非常高的不可思议的人,就像您一样先生! - Hugo Medina

1

我的老板给我回复了,浮点数据不是IEEE格式。

数据类型是TMS320浮点数

由于某些原因,十六进制数据中的实际值每2个字节混合在一起,我的意思是:

80000000 = 0.0
FB7A35DD = 0.061087
F79B3C78 = -0.003491
FB00ADFC = 0.031416

感谢大家的支持


TMS320浮点数文档在这里:http://www.ti.com/lit/an/spra400/spra400.pdf,正如我在对OP的评论中所说,前两个十六进制数字是指数。但是,0.031416的指数怎么可能是“00”?我必须再次问一遍:你确定它们是正确的吗?你在玩我们吗? - Timothy
我仍在研究文件的信息,现在我有一个函数,可以将表示TMS320浮点格式数字的无符号值转换为IEEE浮点格式值,我会明白这些值是否正确。我会确定这些值的结果原因,并且我不是在和你开玩笑,我很认真。 - Hugo Medina
来自十六进制数据的实际值每 2 字节混合一次: 80000000 = 0.0 FB7A35DD = 0.061087 F79B3C78 = -0.003491 FB00ADFC = 0.031416K - Hugo Medina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接