Вопрос

Я читаю данные из двоичного файла.У меня есть документ, который позволяет мне знать, как хранится информация.Чтобы быть уверенным в этом, я использую XVI32.

Я правильно извлекал информационные строки и правильно INT, пока не столкнулся с типом данных поплавка.

Согласно этому файлу:

00800000 = 0.0
7AFBDD35 = 0.061087
9BF7783C = -0.003491
00FBFCAD = 0.031416
.

Я пытался это решить:

struct.unpack('!f', my_float.decode('hex'))[0]
.

и другие разные способы ....

Я проверил эту информацию с некоторыми онлайн-инструментами, такими как: http://babbage.c.qc.cuny.edu/ieee-754/index.xhtml и http://www.binaryconvert.com/result_float.HTML? PECIMAR= 04804604805404904805605599048056055 , но все эти способы бросают мне другое значение в соответствии с исходными результатами.

Я начинаю подозревать, что информация о плавании зашифрована или что-то в этом роде, но почему строка и INT не были зашифрованы?

Это было полезно?

Решение

Интересная головоломка.Работа с документацией, я придумал это:

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
.

Другие советы

Мой босс отправил мне ответ, данные с плавающей точкой не в формате IEEE.

Тип данных TMS320 Плавающая точка

По какой-то причине реальные значения от шестнадцатеричных данных смешивают каждый 2 байта, я имею в виду:

80000000 = 0.0
FB7A35DD = 0.061087
F79B3C78 = -0.003491
FB00ADFC = 0.031416
.

Спасибо за поддержку мне, ребята,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top