3

我正在从二进制文件中读取数据。我有一份文件可以让我知道信息是如何存储的。为了确定这一点,我使用 XVI32。

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

根据这个文件:

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.xhtml和http://www.binaryconvert.com/result_float.html?decimal=048046048054049048056055,但是根据原始结果,所有这些方式都会给我带来不同的价值。

我开始怀疑浮点信息被加密或类似的东西,但为什么 string 和 int 没有被加密?

4

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
于 2012-05-23T18:35:33.480 回答
1

我的老板给我发了答案,浮点数据不是 IEEE 格式。

数据类型为TMS320浮点

出于某种原因,十六进制数据的实际值每 2 个字节混合,我的意思是:

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

谢谢大家支持我

于 2012-05-22T16:04:22.733 回答