2015-02-08 103 views
0

我已經找到了如何做到相反的轉換一個整數到一個16位布爾數組。轉換一個16位布爾數組爲一個整數

Dim ND1_Array As New System.Collections.BitArray(System.BitConverter.GetBytes(Data(2))) 

有我想這

Dim barray(15) As Boolean : barray(0) = True : barray(2) = True : barray(4) = True 
    Dim bittoint As Integer 
    bittoint = Convert.ToInt32(barray(0), 0) 

此代碼拋出一個錯誤呢? 我已經看了遍網,但無法找到如何做到這一點。

bittoint = BitConverter.ToInt32(barray(0), 0) 

這具有的誤差以及 錯誤1個值類型「布爾」不能被轉換爲「字節的1維陣列」。 C:\ PLC \ TCPClientClean \ TCPClientClean \ ChatClient.vb 201 41 TCPClientClean

這就是我想出的。不知道什麼是更好的方法?我剛看到提供的新的更新代碼。

Dim BoolStg As String 
    Dim BoolArra1DexBit As Boolean 
    Dim BitArray1ToInt16 As Integer 
    For BarryDex = 0 To 15 
     BoolArra1DexBit = BoolAray1(BarryDex) 
     If BoolArra1DexBit = True Then 
      BoolStg = "1" & BoolStg 
     Else : BoolStg = "0" & BoolStg 
     End If 
    Next 
    BitArray1ToInt16 = Convert.ToInt16(BoolStg, 2) 
+0

更詳細的錯誤描述請。 – OlimilOops 2015-02-08 20:16:46

+0

無效的基地 ,並在即時窗口中 mscorlib.dll – 2015-02-08 20:20:00

+0

發生第一次機會異常的類型'System.ArgumentException'您使用布爾值提供toint32,這裏沒有第二個參數。 – OlimilOops 2015-02-08 20:20:03

回答

1

小例子

Dim myFlags As Integer = &H11 
    MsgBox(Convert.ToString(myFlags, 2)) 

    Dim ND1_Array As New System.Collections.BitArray(System.BitConverter.GetBytes(myFlags)) 

    Dim myFlags_tmparray(0) As Integer 
    ND1_Array.CopyTo(myFlags_tmparray, 0) 

    MsgBox(Convert.ToString(myFlags_tmparray(0), 2)) 
0

這裏是一個擴展方法將返回整數相當於爲小端或大端,並允許你切換TwosComplement還有:

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim barray(15) As Boolean : barray(0) = True : barray(2) = True : barray(4) = True 

     Dim BigEndianInteger As Integer = barray.ToInteger(False) 
     Dim LittleEndianInteger As Integer = barray.ToInteger() ' <-- default is Little Endian with TwosComplement turned On 

     Debug.Print("BigEndianInteger = " & BigEndianInteger) 
     Debug.Print("LittleEndianInteger = " & LittleEndianInteger) 
    End Sub 

End Class 

Public Module Extensions 

    <Runtime.CompilerServices.Extension()> _ 
    Public Function ToInteger(ByVal BooleanArray() As Boolean, Optional ByVal LittleEndian As Boolean = True, Optional ByVal TwosComplement As Boolean = True) As Integer 
     If BooleanArray.Length <= 32 Then 
      Dim sum As Integer 
      Dim values As New List(Of Boolean)(BooleanArray) 
      If Not LittleEndian Then 
       values.Reverse() 
      End If 
      For i As Integer = 0 To values.Count - 1 
       If values(i) Then 
        If i < (values.Count - 1) Then 
         sum = sum + Math.Pow(2, i) 
        ElseIf TwosComplement Then 
         sum = sum - Math.Pow(2, i) 
        Else 
         sum = sum + Math.Pow(2, i) 
        End If 
       End If 
      Next 
      Return sum 
     Else 
      Throw New Exception("Boolean array length must be less than or equal to 32.") 
     End If 
    End Function 

End Module 
+0

這是Little endian,你的代碼工作得很好!謝謝 – 2015-02-09 05:53:39

+0

您提供的@Idle_Mind代碼除了在數組的第15位爲true時運行良好。例如 Barray1 = 100000000000000 – 2015-02-09 21:23:47

+0

您提供的@Idle_Mind代碼除了當數組的第15位爲true時運行良好。例如 Barray1 = 1000000000000000 LittleEndian = 32768?它應該是-32768 Barray1 = 1111111111111111 LittleEndian = 65535?它應該是-1通過任何二進制到int轉換? – 2015-02-09 21:32:28

相關問題