Я работаю над проектом, который включает 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 бит, мне нужно сдвинуть биты, выполняя операции AND, и потому что 8 не делится на 3 I иногда даже приходится объединять части двух байтов, например, для itemC
.
Было бы гораздо эффективнее читать эти данные как группы по 3 бита, а не как группы из 8 бит.
То, что я придумал, - это преобразовать все байты в биты в строку, используя .toString(2)
, затем используя .substring
, чтобы получить подстроку длиной 3, и преобразовав обратно в число с parseInt(bitString, 2)
, но я думаю, это не тот способ, так как манипуляции со строками медленные, и я на самом деле ничего не делаю со строками.
Можно ли читать биты в группах, например, 3 вместо разбора их из байтов? Или есть более эффективный способ чтения битов из байтов?