Hexadecimal para flotar python
-
12-12-2019 - |
Pregunta
Estoy leyendo datos de un archivo binario.Tengo un documento que me permite saber cómo se almacena la información.Para estar seguro de esto, uso XVI32.
Estaba extrayendo correctamente la cadena de información y los datos de INT correctamente, hasta que me golpeé con el tipo de datos de flotador.
De acuerdo con este archivo:
00800000 = 0.0
7AFBDD35 = 0.061087
9BF7783C = -0.003491
00FBFCAD = 0.031416
Intenté resolver esto con:
struct.unpack('!f', my_float.decode('hex'))[0]
y otras formas diferentes ...
Probé esta información con algunas herramientas en línea como: http://babbage.cs.qc.cuny.edu/ieee-754/index.xhtml y http://www.binaryconvert.com/result_float.html? decimal= 048046048054049048056055 , pero todas estas formas me echan un valor diferente según los resultados originales.
Estoy empezando a sospechar que la información de flotación está encriptada o algo así, ¡pero por qué la cadena e int no estaban encriptados?
Solución
interesante rompecabezas.Trabajando con la documentación que se me ocurrió:
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
Otros consejos
Mi jefe me envió la respuesta, los datos de puntos flotantes no están en formato IEEE.
El tipo de datos es TMS320 Point flotante
Por alguna razón, los valores reales de los datos hexagonales se mezclan cada 2 bytes, quiero decir:
80000000 = 0.0
FB7A35DD = 0.061087
F79B3C78 = -0.003491
FB00ADFC = 0.031416
Gracias por soportarme chicos