Мой вопрос прост, мне нужно преобразовать первые три бита байта в целочисленное значение (Enum). Однако то, что я пытаюсь, я всегда получаю 0 обратно. Вот что говорится в документе:
Bit 0-3: These bits indicate the connection state.
Value 0 to 14 indicate the connection state. Value 3 = Connected
Теперь ответ, который я получаю (от последовательного устройства), представляет собой закодированный поток байтов шестнадцатеричных значений ASCII, поэтому мне сначала нужно преобразовать его из шестнадцатеричной строки в байтовый массив, а затем получить из него биты. Это мой код до сих пор:
Dim strResonse As String = "0C03" 'This should result in a connection state value of 3
Dim ConState(2) As Byte
ConState = HexStringToByteArray(strResonse)
Dim int As Integer = ConState(1) << 1 And ConState(1) << 2 And ConState(1) << 3
Debug.Print(int.ToString)
Private Function HexStringToByteArray(ByVal shex As String) As Byte()
Dim B As Byte() = Enumerable.Range(0, shex.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(shex.Substring(x, 2), 16)).ToArray()
Return Enumerable.Range(0, shex.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(shex.Substring(x, 2), 16)).ToArray()
End Function
Было бы проще использовать битовую операцию
Dim connectionState As Integer
Dim response As Integer = &HC03
' Get the first 4 bits. 15 in binary is 1111
connectionState = response And 15
Если ваш ввод действительно является строкой, есть встроенный способ преобразования в целое число.
Dim response As Integer = Convert.ToInt32("C03", 16)
Если вы действительно хотите получить массив, я предлагаю вам использовать встроенный метод.
Dim allBits As Byte() = BitConverter.GetBytes(response)
Также может пригодиться класс битовый массив.
Привет, Lotus, для твоего объяснения я попробовал кое-что, и я не могу получить только первые три бита одного байта и преобразовать их в целое число/перечисление. Остальные биты (4 - 7) зарезервированы для другой информации.
Должно работать довольно легко: Dim int As Integer = Convert.ToInt32("C03", 16) & 15
Когда я пытаюсь это сделать, я получаю результат 307515. Я ввожу строку 0C03
, потому что это именно то, что я получаю от последовательного устройства.
Я имел в виду, И не &. Извини за это. Dim int As Integer = ConvertConvert.ToInt32("C03", 16) And 15
Если соответствующие значения от 0 до 14, это 4 бита, а не 3. the_lotus предоставил то, что должно работать, см. их ответ.