2010-06-04 8 views
0

Suivi disponible: Il y a un suivi avec plus de détails, voir Convert MBF to IEEE.Convert MBF simple et double à la norme IEEE

J'ai des données existantes qui est encore en cours d'utilisation, la lecture des fichiers binaires ne sont pas le problème, le format numérique est. Tous les nombres à virgule flottante sont enregistrés au format MBF (Single et Double). J'ai trouvé a topic about that on the MSDN boards mais celui-ci ne traite que des valeurs simples. Je voudrais également rester loin des appels API aussi loin que je peux.

Est-ce que quelqu'un a une solution pour les doubles?

Edit: Juste au cas où quelqu'un en a besoin, voici le code VB.NET (il est Option Strict conforme) J'ai fini avec (ne hésitez pas à le convertir en C# et le modifier dans):

''' <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 

Répondre

1

A this La page Wiki contient des liens vers quelques exemples de code différents pour faire cela en C, C++ et Python.

Un ou plusieurs d'entre eux devraient, espérons-le, être relativement faciles à convertir dans une langue qui vous convient.

Questions connexes