Если вы собираетесь выполнять эти преобразования во время работы под Windows, возможно, быстрее будет загрузить и установить mbf2ieee.exe и вызвать функцию CVS
, предлагаемую в результате Mbf2ieee.dll
(например, [ctypes] [2]).
Если вы хотите сделать это на чистом Python, я думаю (но я не могу проверить, не имея под рукой номеров MBF), что может сработать следующее (я просто перенес это на Python из C кода) здесь ):
def mbf2ieee(mbf_4bytestring):
msbin = struct.unpack('4B', mbf_4bytestring)
if msbin[3] == 0: return 0.0
ieee = [0] * 4
sign = msbin[2] & 0x80
ieee_exp = msbin[3] - 2
ieee[3] = sign | (ieee_exp >> 1)
ieee[2] = (ieee_exp << 7) | (msbin[2] & 0x7f)
ieee[:2] = msbin[:2]
return struct.unpack('f', ieee)[0]
Если это имеет проблемы, можете ли вы привести примеры входных значений и ожидаемых результатов?
Редактировать : если вам нужна обратная функция, она должна быть:
def float2mbf4byte(f):
ieee = struct.pack('f', f)
msbin = [0] * 4
sign = ieee[3] & 0x80
msbin_exp = (ieee[3] << 1) | (ieee[2] >> 7)
# how do you want to treat too-large exponents...?
if msbin_exp == 0xfe: raise OverflowError
msbin_exp += 2
msbin[3] = msbin_exp
msbin[2] = sign | (ieee[2] & 0x7f)
msbin[:2] = ieee[:2]
return msbin