Преобразуйте сингл MBF и удвойтесь до IEEE

Доступное продолжение: существует продолжение с более подробной информацией, посмотрите, Преобразовывают 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
1
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

На этой странице Вики есть ссылки на несколько различных примеров кода для этого на C, C++ и Python.

Один или несколько из них, надеюсь, будет относительно легко преобразовать в подходящий для вас язык.

1
ответ дан 3 September 2019 в 00:03
поделиться

Microsoft опубликовала статью в базе знаний об этом, включая P / Invokable DLL, которую вы можете использовать для преобразования из MBF в IEEE.

Архивная копия доступна здесь .

1
ответ дан 3 September 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: