Доступное продолжение: существует продолжение с более подробной информацией, посмотрите, Преобразовывают MBF в IEEE.
У меня есть некоторые данные прежней версии, которые все еще используются, чтение двоичных файлов не является проблемой, числовой формат. Все числа с плавающей точкой сохранены в формате MBF (Единственный и Двойной). Я нашел тему об этом на платах MSDN, но что единственные соглашения с Единственными значениями. Я был бы также хотеть избегать Вызовов API насколько я могу.
У кого-либо есть решение для, Удваивается?
Править: На всякий случай кому-то нужен он, вот Код VB.NET (это
Option Strict
совместимый) я закончил с (не стесняйтесь преобразовывать его в C# и редактировать его в):'''
Converts a MBF Single to an IEEE Single ''' The MBF Single value '''The converted IEEE Single value '''Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520 Public Shared Function MTIS(ByVal src As Single) As Single Return MTIS(BitConverter.GetBytes(src), 0) End Function '''Converts a MBF Single to an IEEE Single ''' The source array ''' The start index at which the Single starts '''The converted IEEE Single value '''Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520 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 '''Converts a MBF Double to a IEEE Double ''' The MBF Double value '''The converted IEEE Double value '''Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520 Public Shared Function MTID(ByVal src As Double) As Double Return MTID(BitConverter.GetBytes(src), 0) End Function '''Converts a MBF Double to a IEEE Double ''' The source array ''' The start index at which the Double starts '''The converted IEEE Double value '''Here can find some further information about this topic: http://en.wikipedia.org/wiki/Microsoft_Binary_Format http://support.microsoft.com/kb/140520 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
На этой странице Вики есть ссылки на несколько различных примеров кода для этого на C, C++ и Python.
Один или несколько из них, надеюсь, будет относительно легко преобразовать в подходящий для вас язык.
Microsoft опубликовала статью в базе знаний об этом, включая P / Invokable DLL, которую вы можете использовать для преобразования из MBF в IEEE.
Архивная копия доступна здесь .