Извлечение битов в int-фрагмент из байтового фрагмента - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий фрагмент байта, из которого мне нужно извлечь биты и поместить их в [] int, так как я собираюсь получить отдельные битовые значения позже.Мне трудно понять, как это сделать.

ниже мой код

data := []byte{3 255}//binary representation is for 3 and 255 is 00000011 11111111

, что мне нужно, это кусочек битов -> [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]

Что я пытался

  • Я пытался преобразовать фрагмент байта в Uint16 с помощью BigEndian, а затем попытался использовать strconv.FormatUint, но это не удалось с ошибкой panic: runtime error: index out of range
  • Видел много простых примероввыходное битовое представление числа с использованием функции fmt.Printf, но это бесполезно для меня, так как мне нужен фрагмент int для дальнейшего доступа к битовым значениям.

Нужно ли здесь использовать операторы сдвига битов?Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 15 октября 2018

Один из способов - циклически проходить байты и использовать 2-й цикл для сдвига байтовых значений побитно и проверять биты с помощью битовой маски.И добавьте результат к выходному срезу.

Вот его реализация:

func bits(bs []byte) []int {
    r := make([]int, len(bs)*8)
    for i, b := range bs {
        for j := 0; j < 8; j++ {
            r[i*8+j] = int(b >> uint(7-j) & 0x01)
        }
    }
    return r
}

Тестирование:

fmt.Println(bits([]byte{3, 255}))

Вывод (попробуйте на Go Playground ):

[0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...