2

利用可能なフォローアップ:詳細についてのフォローアップがあります。MBFをIEEEに変換するを参照してください。

まだ使用されているレガシーデータがいくつかあります。バイナリファイルの読み取りは問題ではなく、数値形式は問題です。すべての浮動小数点数はMBF形式(シングルおよびダブル)で保存されます。私はMSDNボードでそれについてのトピックを見つけましたが、それは単一の値のみを扱っています。また、可能な限りAPI呼び出しを避けたいと思います。

誰かがダブルスの解決策を持っていますか?

編集:誰かがそれを必要とする場合に備えて、これがOption Strict私が最終的に得たVB.NETコード(準拠)です(C#に変換して編集してください):

''' <summary>Converts a MBF Single to an IEEE Single</summary>
''' <param name="src">The MBF Single value</param>
''' <returns>The converted IEEE Single value</returns>
''' <remarks>Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520</remarks>
Public Shared Function MTIS(ByVal src As Single) As Single
    Return MTIS(BitConverter.GetBytes(src), 0)
End Function

''' <summary>Converts a MBF Single to an IEEE Single</summary>
''' <param name="src">The source array</param>
''' <param name="startIndex">The start index at which the Single starts</param>
''' <returns>The converted IEEE Single value</returns>
''' <remarks>Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520</remarks>
Public Shared Function MTIS(ByVal src() As Byte, ByVal startIndex As Integer) As Single
    Dim mbf(3) As Byte
    Dim ieee(3) As Byte

    Array.Copy(src, startIndex, mbf, 0, 4)

    If mbf(3) <> 0 Then
        Dim sign As Byte = mbf(2) And ToByte(&H80)
        Dim exp As Byte = mbf(3) - ToByte(2) ' -1-128-127 '

        ieee(3) = ieee(3) Or sign
        ieee(3) = ieee(3) Or exp >> 1
        ieee(2) = ieee(2) Or exp << 7
        ieee(2) = ieee(2) Or mbf(2) And ToByte(&H7F)
        ieee(1) = mbf(1)
        ieee(0) = mbf(0)
    End If

    Return BitConverter.ToSingle(ieee, 0)
End Function


''' <summary>Converts a MBF Double to a IEEE Double</summary>
''' <param name="src">The MBF Double value</param>
''' <returns>The converted IEEE Double value</returns>
''' <remarks>Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520</remarks>
Public Shared Function MTID(ByVal src As Double) As Double
    Return MTID(BitConverter.GetBytes(src), 0)
End Function

''' <summary>Converts a MBF Double to a IEEE Double</summary>
''' <param name="src">The source array</param>
''' <param name="startIndex">The start index at which the Double starts</param>
''' <returns>The converted IEEE Double value</returns>
''' <remarks>Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520</remarks>
Public Shared Function MTID(ByVal src() As Byte, ByVal startIndex As Integer) As Double
    Dim mbf(7) As Byte
    Dim ieee(7) As Byte

    Array.Copy(src, startIndex, mbf, 0, 8)

    If mbf(7) <> 0 Then
        Dim sign As Byte = mbf(6) And ToByte(&H80)
        Dim exp As Int16 = mbf(7) - 128S - 1S + 1023S

        ieee(7) = ieee(7) Or sign
        ieee(7) = ieee(7) Or ToByte(exp >> 4 And &HFF)
        ieee(6) = ieee(6) Or ToByte(exp << 4 And &HFF)

        For i As Integer = 6 To 1 Step -1
            mbf(i) <<= 1
            mbf(i) = mbf(i) Or mbf(i - 1) >> 7
        Next
        mbf(0) <<= 1

        For i As Integer = 6 To 1 Step -1
            ieee(i) = ieee(i) Or mbf(i) >> 4
            ieee(i - 1) = ieee(i - 1) Or mbf(i) << 4
        Next
        ieee(0) = ieee(0) Or mbf(0) >> 4
    End If

    Return BitConverter.ToDouble(ieee, 0)
End Function
4

2 に答える 2

2

このWiki ページには、C、C++、および Python でこれを行うためのいくつかの異なるコード サンプルへのリンクがあります

それらの 1 つまたは複数は、うまくいけば、自分に合った言語に比較的簡単に変換できるはずです。

于 2010-06-04T13:10:23.583 に答える
1

Microsoft は、MBF から IEEE への変換に使用できる P/Invokable DLL を含む、これに関する KB 記事を公開しています。

アーカイブされたコピーは、こちらから入手できます

于 2010-06-04T14:15:20.243 に答える