Estoy trabajando en Python 3.6. Recibo de la comunicación en serie en la cadena '3F8E353F'. Este es un número flotante 1.111. ¿Cómo puedo convertir esta cadena en un número flotante? Gracias

0
Oscar Alegria 16 jun. 2017 a las 13:44

3 respuestas

La mejor respuesta

Ah, sí. Como esto es de 32 bits, descomprímalo en un int primero y luego:

x='3F8E353F'
struct.unpack('f',struct.pack('i',int(x,16)))

En mi sistema esto da:

>>> x='3F8E353F'
>>> struct.unpack('f',struct.pack('i',int(x,16)))
(1.1109999418258667,)
>>>

Muy cerca del valor esperado. Sin embargo, esto puede dar resultados 'hacia atrás' basados en la 'endianness' de bytes en su sistema. Algunos sistemas almacenan primero sus bytes menos significativos, primero los bytes más significativos. Consulte esta página de referencia para ver los descriptores a formato según el orden de los bytes.

1
TomServo 16 jun. 2017 a las 11:13

Usé struct.unpack('f',struct.pack('i',int(x,16))) para convertir el valor hexadecimal en flotante, pero para el valor negativo obtengo un error inferior

struct.error: argumento fuera de rango

Para resolver esto, utilicé el siguiente código que convierte Hex (0xc395aa3d) en valor flotante (-299.33). Funciona tanto para valores positivos como negativos.

x = 0xc395aa3d
struct.unpack('f', struct.pack('I', int(x,16) )) 
0
Sushil Jadhav 19 mar. 2019 a las 09:57

Otra forma es usar bytes.fromhex ()

import struct
hexstring = '3F8E353F'
struct.unpack('!f', bytes.fromhex(hexstring))[0] 
#answer:1.1109999418258667

Nota: La forma '!' está disponible para aquellas almas pobres que afirman que no pueden recordar si el orden de bytes de la red es big-endian o little-endian (de struct docs).

0
Minas Pertselakis 10 feb. 2020 a las 15:58