Convert hex to float Convert hex to float python 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 floatprint convert("41973333")    # returns 1.88999996185302734375E1print convert("41995C29")    # returns 1.91700000762939453125E1print convert("470FC614")    # returns 3.6806078125E4

I believe that the ctypes module makes sense here, because you're 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, you'd do roughly the same thing, taking a pointer and then casting and dereferencing it:

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

and that's exactly what the Python code using the ctypes library is doing in my example.


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

"\x41\x91\x33\x33" is a 4 byte string even though it looks like 16

>>> len("\x41\x91\x33\x33")4>>> import struct  >>> struct.unpack(">fff","\x41\x97\x33\x33\x41\x99\x5C\x29\x47\x0F\xC6\x14")(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.899999618519.170000076336806.078125