Получить первые три бита из байта - PullRequest
0 голосов
/ 28 мая 2019

У меня простой вопрос, мне нужно преобразовать первые три бита байта в целочисленное (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

1 Ответ

2 голосов
/ 28 мая 2019

Было бы проще использовать битовую операцию

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)

Существует также класс BitArray , который может быть полезен.

...