Decimal hexadecimal para flutuar Python
-
12-12-2019 - |
Pergunta
Estou lendo dados de um arquivo binário.Tenho um documento que me permite saber como as informações são armazenadas.Para ter certeza disso eu uso XVI32.
Eu estava extraindo strings de informações e dados int corretamente, até encontrar o tipo de dados float.
De acordo com este arquivo:
00800000 = 0.0
7AFBDD35 = 0.061087
9BF7783C = -0.003491
00FBFCAD = 0.031416
Tentei resolver isso com:
struct.unpack('!f', my_float.decode('hex'))[0]
E outras maneiras diferentes....
Testei essas informações com algumas ferramentas online como:http://babbage.cs.qc.cuny.edu/IEEE-754/index.xhtml e http://www.binaryconvert.com/result_float.html?decimal=048046048054049048056055, mas todas essas formas me dão um valor diferente de acordo com os resultados originais.
Estou começando a suspeitar que as informações flutuantes sejam criptografadas ou algo parecido, mas por que string e int não foram criptografados?
Solução
Quebra-cabeça interessante.Trabalhando com a documentação, descobri o seguinte:
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
Outras dicas
meu chefe me enviou a resposta: Os dados de ponto flutuante não estão no formato IEEE.
O tipo de dados é ponto flutuante TMS320
por alguma razão, os valores reais dos dados hexadecimais são misturados a cada 2 bytes, quero dizer:
80000000 = 0.0
FB7A35DD = 0.061087
F79B3C78 = -0.003491
FB00ADFC = 0.031416
Obrigado por me apoiarem pessoal