Hex decimal to float Python

1k Views Asked by At

I'm reading data from a binary file. I have a document that lets me know how the information is stored. To be sure of this I use XVI32.

I was extracting information string and int data correctly, until I bumped with float data type.

According to this file:

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

I tried to solve this with:

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

And other different ways....

I tested this information with some online tools like: http://babbage.cs.qc.cuny.edu/IEEE-754/index.xhtml and http://www.binaryconvert.com/result_float.html?decimal=048046048054049048056055, but all of these ways throws me a different value according the original results.

I'm starting to suspect that float information is encrypted or something like that but why string and int weren't encrypted?

2

There are 2 best solutions below

1
On BEST ANSWER

Interesting puzzle. Working with the documentation I came up with this:

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
3
On

my boss sent me the answer, The floating point data is not in IEEE format.

The data type is TMS320 floating point

for some reason, the real values from hex data are mixed each 2 bytes, I mean:

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

Thankyou for support me guys