1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| from ctypes import Structure, c_uint
class MyFloat(Structure):
_fields_ = [("expo", c_uint, 7),
("sign", c_uint, 1),
("m2", c_uint, 4),
("m1", c_uint, 4),
("m4", c_uint, 4),
("m3", c_uint, 4),
("m6", c_uint, 4),
("m5", c_uint, 4),
("m8", c_uint, 4),
("m7", c_uint, 4),
("m10", c_uint, 4),
("m9", c_uint, 4),
("m12", c_uint, 4),
("m11", c_uint, 4),
("m14", c_uint, 4),
("m13", c_uint, 4)]
def read_flt(rec):
f = MyFloat.from_buffer_copy(rec)
m = reduce(lambda acc,x: x + acc/10.0, (f.m14,f.m13,f.m12,f.m11,f.m10,f.m9,f.m8,
f.m7,f.m6,f.m5,f.m4,f.m3,f.m2,f.m1))
return (1 - 2 * f.sign) * m * 10 ** (f.expo-64)
tests = ['\x41\x30\x00\x00\x00\x00\x00\x00',
'\x40\x10\x00\x00\x00\x00\x00\x00',
'\x40\x15\x00\x00\x00\x00\x00\x00',
'\xC0\x20\x00\x00\x00\x00\x00\x00']
for t in tests:
print read_flt(t) |