Как мне конвертировать 'Single' в двоичный файл? - PullRequest
0 голосов
/ 21 сентября 2019

Я собираю небольшую горстку методов расширения для преобразования числовых значений в их двоичные эквиваленты.

Но я сталкиваюсь с проблемой.

Мы можем использовать *Перегрузка 1005 * для преобразования этих типов в двоичные:

Byte
Short
Integer
Long

Например:

Dim iInteger As Integer
Dim sBinary As String

iInteger = Integer.MaxValue
sBinary = Convert.ToString(iInteger, 2)

Но для Single, которая принимает базовое значение, перегрузки не существует.Перегрузка с одним аргументом возвращает научную запись, а не двоичное значение.

Я пробовал этот код, адаптированный из этого ответа :

Public Function ToBinary(Value As Single) As String
  Dim aBits As Integer()

  Dim _
    iLength,
    iIndex As Integer

  Select Case Value
    Case < BitLengths.BYTE : iLength = 7
    Case < BitLengths.WORD : iLength = 15
    Case < BitLengths.DWORD : iLength = 31
    Case < BitLengths.QWORD : iLength = 63
  End Select

  aBits = New Integer(iLength) {}

  For iIndex = 0 To iLength
    aBits(iLength - iIndex) = Value Mod 2
    Value \= 2
  Next

  ToBinary = String.Empty

  aBits.ForEach(Sub(Bit)
                  ToBinary &= Bit
                End Sub)
End Function

К сожалению, однако, он возвращает неточные результаты:

Input: 1361294667
Result: Assert.AreEqual failed. Expected:<01010001001000111011010101001011>. Actual:<01010001001000111011010110000000>.

Мы можем получить ожидаемое значение из Programmer View старого калькулятора Windows 7:

Enter image description here

Учитывая это, как мы можем надежно преобразовать значение Single в двоичную строку?

- EDIT -

Я нашел это утверждение : "Нет точного двоичного представления 0,1 или 0,01." Это в значительной степени говорит само за себя.Я решил отказаться от этого, так как стало ясно, что это бесполезное занятие.

1 Ответ

6 голосов
/ 21 сентября 2019

Пример ожидаемого значения, которое вы указали, представляет собой просто двоичное представление числа, однако, возможно, не самый эффективный способ, если вы хотите получить представление числа в двоичном формате IEEE-754, которое вы можете использовать BitConverter.GetBytesкак в следующем примере:

Sub Main
    Dim i As Int32 = 1361294667
    Console.WriteLine(ObjectAsBinary(i))
    Dim s As Single = 1361294667
    Console.WriteLine(ObjectAsBinary(s))
End Sub

Private Function ObjectAsBinary(o As Object) As String
    Dim bytes = BitConverter.GetBytes(o)
    If BitConverter.IsLittleEndian Then
        Array.Reverse(bytes)
    End If
    Dim result As String = ""
    For Each b In bytes
        result &= Convert.ToString(b, 2).PadLeft(8, "0")
    Next
    Return result
End Function

Этот код выводит следующее:

01010001001000111011010101001011 - соответствует вашему примеру

01001110101000100100011101101011 - соответствует IEEE-754 из IEEE-754 преобразователь с плавающей запятой

...