我需要将 .NET 中的 IEEE Single 转换为旧的 MBF Single。这里有一个类似的帖子,但它与我需要的相反。
将 MBF Single 和 Double 转换为 IEEE
我可以使用 VB.NET(首选)或 C# 代码。
我在https://community.embarcadero.com/index.php/article/technical-articles/162-programming/14799-converting-between-microsoft-binary-and-ieee-forma遇到了 Borland C++ 的一个示例
我混淆了这个例子(我不懂 C++),并在 VB.NET 中提出了以下内容。它除了零值外都有效,所以我添加了一个零检查。我不知道 C++ 代码是否也出现零错误,或者这是我的转换。无论如何,它似乎工作。
Function MTIS(value As Single) As Byte()
Dim msbin(3) As Byte
If value <> 0 Then ' HACK
Dim ieee As Byte() = BitConverter.GetBytes(value)
Dim sign As Byte
Dim msbin_exp As Byte
sign = ieee(3) And CByte(&H80)
msbin_exp = msbin_exp Or ieee(3) << 1
msbin_exp = msbin_exp Or ieee(2) >> 7
' An ieee exponent of 0xfe overflows in MBF
If msbin_exp = CByte(&HFE) Then
Throw New OverflowException("An IEEE exponent of 0xFE overflows in MBF.")
End If
msbin_exp += CByte(2) ' actually, -127 + 128 + 1
msbin(3) = msbin_exp
msbin(2) = msbin(2) Or sign
msbin(2) = msbin(2) Or (ieee(2) And CByte(&H7F))
msbin(1) = ieee(1)
msbin(0) = ieee(0)
End If
Return msbin
End Function