# python – Convert hex to float

## python – Convert hex to float

In Python 3:

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

In Python 2:

``````>>> import struct
>>> struct.unpack(!f, 41973333.decode(hex))
18.899999618530273
>>> struct.unpack(!f, 41995C29.decode(hex))
19.170000076293945
>>> struct.unpack(!f, 470FC614.decode(hex))
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))))
...
18.8999996185
19.1700000763
36806.078125
``````