python – Convert hex to float

python – Convert hex to float

In Python 3:

>>> import struct
>>> struct.unpack(!f, bytes.fromhex(41973333))[0]
18.899999618530273
>>> struct.unpack(!f, bytes.fromhex(41995C29))[0]
19.170000076293945
>>> struct.unpack(!f, bytes.fromhex(470FC614))[0]
36806.078125

In Python 2:

>>> import struct
>>> struct.unpack(!f, 41973333.decode(hex))[0]
18.899999618530273
>>> struct.unpack(!f, 41995C29.decode(hex))[0]
19.170000076293945
>>> struct.unpack(!f, 470FC614.decode(hex))[0]
36806.078125

I recommend using the ctypes module which basically lets you work with low level data types. In your case you could say

from ctypes import *

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(41973333)    # returns 1.88999996185302734375E1

print convert(41995C29)    # returns 1.91700000762939453125E1

print convert(470FC614)    # returns 3.6806078125E4

I believe that the ctypes module makes sense here, because youre essentially asking how to perform low-level bit casting. Your question is basically, how do I tell Python to take some data and interpret that data as if those exact same bits were a different data type?

In C if you had an int and wanted to interpret its bits as a float, youd do roughly the same thing, taking a pointer and then casting and dereferencing it:

int i = 0x41973333;
float f = *((float*)&i);

and thats exactly what the Python code using the ctypes library is doing in my example.

python – Convert hex to float

Im guessing this question relates to this one and you are working with 4 bytes rather than 8 hex digits.

x41x91x33x33 is a 4 byte string even though it looks like 16

>>> len(x41x91x33x33)
4
>>> import struct  
>>> struct.unpack(>fff,x41x97x33x33x41x99x5Cx29x47x0FxC6x14)
(18.899999618530273, 19.170000076293945, 36806.078125)

If you do need to deal with the string of hexdigits rather than the actual bytes, you can use struct.pack to convert it, like this

>>> for hx in [41973333,41995C29,470FC614]:
...     print(struct.unpack(>f,struct.pack(>i,int(hx,16)))[0])
... 
18.8999996185
19.1700000763
36806.078125

Leave a Reply

Your email address will not be published.