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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top