Как эффективно читать биты из байтов?

Я работаю над проектом, который включает WebSockets, и данные между сервером (Node.js) и клиентом (Chrome) отправляются с использованием специального (очень простого) формата для обмена данными. Я настроил.

Я отправляю данные частями по 3 бита, потому что я отправляю элементы, у всех которых есть 8 возможностей. Формат данных выглядит следующим образом:

            0          1
bit index   01234567 8901...
item        aaabbbcc cddd...

В настоящее время я разбираю элементы из байтов следующим образом:

var itemA = bytes[0] >> 5;
var itemB = (bytes[0] >> 2) & 7;
var itemC = (bytes[0] & 3) << 1 | bytes[1] >> 7;
var itemD = (bytes[1] >> 4) & 7;

Лично мне кажется, что это слишком изощренно. Проблема в том, что это сложно только потому, что я получаю данные в байтах, которые кратны 8. Чтобы разобрать элементы из 3 бит, мне нужно сдвигать биты, выполняя операции И, и поскольку 8 не делится на 3 I иногда даже приходится объединять части из двух байтов, как для itemC .

Было бы гораздо эффективнее читать эти данные как группы по 3 бита, а не как группы по 8 бит.

Что я придумал, так это преобразование всех байтов в биты в строку с помощью .toString (2) , затем с помощью .substring , чтобы получить подстроку длиной 3, и преобразование обратно в число с помощью parseInt (bitString, 2) , но я полагаю, что это не способ сделать это, поскольку манипуляции со строками медленные, и я на самом деле не делаю ничего, связанного со строками.

Можно ли читать биты группами, например 3 вместо того, чтобы разбирать их по байтам? Или есть более эффективный способ чтения битов из байтов?

9
задан pimvdb 22 October 2011 в 17:10
поделиться