2016-03-07 2 views
2

Я искал способ преобразования десятичного значения в двоичную строку, но до сих пор не удалось. Я нашел много способов конвертировать целое число в двоичное (How to convert a decimal number to a binary number with fixed bits, How to convert from decimal to binary .NET например), но я хочу иметь возможность конвертировать десятичные значения (2.5, 2374098.034286197548 и т. Д.). Есть ли способ, или нет способа конвертировать фактические десятичные значения?Преобразование десятичного в двоичный файл в VB.NET

+0

Я не знаю ничего встроенного, нет ... вы хотите, чтобы он был двоичным с двоичной точкой, например. "10.1" для (десятичный) 2.5? –

+0

Я не уверен, сколько битов мне нужно для этого, но я хотел его в двоичном формате байта (0000 0000, 0000 0001). – ARidder101

+1

'Decimal.GetBits()'? –

ответ

0

Мне кажется, что нет реального правильного способа преобразования чисел с десятичными позициями (1.03, 234.65), поэтому я решил сделать что-то грязное, чтобы его обработать.

 Dim this As String = String.Empty 
     For Each Match As Match In Regex.Matches(BoxyBoxington.Text, "\d+") 
      If Match.Value.toDecimal <= Byte.MaxValue.toDecimal Then 
       this = this + Convert.ToString(Match.Value.toByte, 2).PadLeft(8, "0") + NewLine 
      ElseIf Match.Value.toDecimal <= Short.MaxValue.toDecimal Then 
       this = this + Convert.ToString(Match.Value.toShort, 2).PadLeft(16, "0") + NewLine 
      ElseIf Match.Value.toDecimal <= Integer.MaxValue.toDecimal Then 
       this = this + Convert.ToString(Match.Value.toInteger, 2).PadLeft(32, "0") + NewLine 
      ElseIf Match.Value.toDecimal <= Long.MaxValue.toDecimal Then 
       this = this + Convert.ToString(Match.Value.toLong, 2).PadLeft(64, "0") + NewLine 
      Else 
       Exit For 
      End If 
     Next 

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

Мои пользовательские расширения:

''' <summary> 
''' Handles conversion of variable into Long Integer. 
''' </summary> 
''' <param name="X"></param> 
''' <param name="I">Returned if conversion fails.</param> 
''' <returns>Signed 64bit Integer</returns> 
''' <remarks></remarks> 
<Extension> _ 
Public Function toLong(Of T)(ByRef X As T, Optional I As Long = 0) As Long 
    Dim S As String = X.ToString 
    Try 
     If S = String.Empty Then 
      Return I 
     Else 
      Return Long.Parse(S) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnLong As Long 
     Dim Parsed As Byte 
     For Each Character In S.ToCharArray 
      If Character = "-" Then 
       If S.Substring(0, 1).ToString <> "-" Then 
        result = Character + result 
       End If 
      End If 
      If Character = "." Then 
       Exit For 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If Integer.TryParse(result, ReturnLong) Then 
       Return Integer.Parse(ReturnLong) 
      Else 
       If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then 
        Return Integer.MaxValue 
       ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then 
        Return Integer.MinValue 
       Else 
        Return Integer.Parse(ReturnLong) 
       End If 
      End If 
     Else 
      Return I 
     End If 
    End Try 
End Function 

''' <summary> 
''' Handles conversion of variable to Integer. 
''' </summary> 
''' <param name="X"></param> 
''' <param name="I">Returned if conversion fails.</param> 
''' <returns>Signed 32bit Integer</returns> 
''' <remarks></remarks> 
<Extension> _ 
Public Function toInteger(Of T)(ByRef X As T, Optional I As Integer = 0) As Integer 
    Dim S As String = X.ToString 
    Try 
     If S = String.Empty Then 
      Return I 
     Else 
      Return Integer.Parse(S) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnInt As Integer 
     Dim Parsed As Byte 
     For Each Character In S.ToCharArray 
      If Character = "-" Then 
       If S.Substring(0, 1).ToString <> "-" Then 
        result = Character + result 
       End If 
      End If 
      If Character = "." Then 
       Exit For 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If Integer.TryParse(result, ReturnInt) Then 
       Return Integer.Parse(ReturnInt) 
      Else 
       If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then 
        Return Integer.MaxValue 
       ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then 
        Return Integer.MinValue 
       Else 
        Return Integer.Parse(ReturnInt) 
       End If 
      End If 
     Else 
      Return I 
     End If 
    End Try 
End Function 

''' <summary> 
''' Handles conversion of variable to Short Integer. 
''' </summary> 
''' <param name="X"></param> 
''' <param name="I">Returned if conversion fails.</param> 
''' <returns>Signed 16bit Integer</returns> 
''' <remarks></remarks> 
<Extension> _ 
Public Function toShort(Of T)(ByRef X As T, Optional I As Short = 0) As Short 
    Dim S As String = X.ToString 
    Try 
     If S = String.Empty Then 
      Return I 
     Else 
      Return Short.Parse(S) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnShort As Short 
     Dim Parsed As Byte 
     For Each Character In S.ToCharArray 
      If Character = "-" Then 
       If S.Substring(0, 1).ToString <> "-" Then 
        result = Character + result 
       End If 
      End If 
      If Character = "." Then 
       Exit For 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If Short.TryParse(result, ReturnShort) Then 
       Return Short.Parse(ReturnShort) 
      Else 
       If Integer.Parse(result) > Integer.Parse(Short.MaxValue.ToString) Then 
        Return Short.MaxValue 
       ElseIf Integer.Parse(result) < Integer.Parse(Short.MinValue.ToString) Then 
        Return Short.MinValue 
       Else 
        Return Short.Parse(ReturnShort) 
       End If 
      End If 
     Else 
      Return I 
     End If 
    End Try 
End Function 

''' <summary> 
''' Handles conversion of variable to Tiny Integer 
''' </summary> 
''' <param name="X"></param> 
''' <param name="I">Returned if conversion fails.</param> 
''' <returns>Signed 8bit Integer</returns> 
''' <remarks></remarks> 
<Extension> _ 
Public Function toSByte(Of T)(ByRef X As T, Optional I As SByte = 0) As SByte 
    Dim S As String = X.ToString 
    Try 
     If S = String.Empty Then 
      Return I 
     Else 
      Return SByte.Parse(S) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnByte As SByte 
     Dim Parsed As Byte 
     For Each Character In S.ToCharArray 
      If Character = "-" Then 
       If S.Substring(0, 1).ToString <> "-" Then 
        result = Character + result 
       End If 
      End If 
      If Character = "." Then 
       Exit For 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If SByte.TryParse(result, ReturnByte) Then 
       Return SByte.Parse(ReturnByte) 
      Else 
       If Short.Parse(result) > Short.Parse(SByte.MaxValue.ToString) Then 
        Return SByte.MaxValue 
       ElseIf Short.Parse(result) < Short.Parse(SByte.MinValue.ToString) Then 
        Return SByte.MinValue 
       Else 
        Return I 
       End If 
      End If 
     Else 
      Return I 
     End If 
    End Try 
End Function 

''' <summary> 
''' Handles conversion of variable to Tiny Integer 
''' </summary> 
''' <param name="X"></param> 
''' <param name="I">Returned if conversion fails.</param> 
''' <returns>Unsigned 8bit Integer</returns> 
''' <remarks></remarks> 
<Extension> _ 
Public Function toByte(Of T)(ByRef X As T, Optional I As Byte = 0) As Byte 
    Dim S As String = X.ToString 
    Try 
     If S = String.Empty Then 
      Return I 
     Else 
      Return Byte.Parse(S) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnByte As Byte 
     Dim Parsed As Byte 
     For Each Character In S.ToCharArray 
      If Character = "-" Then 
       If S.Substring(0, 1).ToString <> "-" Then 
        Exit For 
       End If 
      End If 
      If Character = "." Then 
       Exit For 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If Byte.TryParse(result, ReturnByte) Then 
       Return Byte.Parse(ReturnByte) 
      Else 
       If Short.Parse(result) > Short.Parse(Byte.MaxValue.ToString) Then 
        Return Byte.MaxValue 
       ElseIf Short.Parse(result) < Short.Parse(Byte.MinValue.ToString) Then 
        Return Byte.MinValue 
       Else 
        Return I 
       End If 
      End If 
     Else 
      Return I 
     End If 
    End Try 
End Function 

<Extension> _ 
Public Function toDecimal(Of T)(X As T) As Decimal 
    Dim s As String = X.ToString 
    Try 
     If s = String.Empty Then 
      Return 0 
     Else 
      Return Decimal.Parse(s) 
     End If 
    Catch 
     Dim result As String = String.Empty 
     Dim ReturnDec As Decimal 
     Dim Parsed As Byte 
     For Each Character In s.ToCharArray 
      If Character = "-" Then 
       If s.Substring(0, 1).ToString <> "-" Then 
        result = Character + result 
       End If 
      End If 
      If Character = "." Then 
       result = result + Character 
      End If 
      If Byte.TryParse(Character, Parsed) Then 
       result = result + Parsed.ToString 
      End If 
     Next 
     If result <> String.Empty Then 
      If Decimal.TryParse(result, ReturnDec) Then 
       Return Decimal.Parse(ReturnDec) 
      Else 
       Return 0 
      End If 
     Else 
      Return 0 
     End If 
    End Try 
End Function 

Это не очень красиво, но я думаю, он будет работать достаточно хорошо для меня.

Результаты использования:

100,13 - 01100100 и 00001101

52000,500 - 00000000000000001100101100100000 и 0000000111110100

Это требует доработки, но это то, что я придумал. Если кто-то может найти некоторые улучшения, не стесняйтесь, дайте мне знать.

Смежные вопросы