2015-02-08 102 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

相关问题