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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top