我正在开发一个包含 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 整除有时甚至必须组合两个字节的一部分,例如 itemC
。
将这些数据作为 3 位组而不是 8 位组读取会更有效。
我想出的是使用 .toString(2)
将所有字节转换为位到字符串,然后使用 .substring
得到一个有长度的子字符串3,并使用 parseInt(bitString, 2)
转换回数字,但我想这不是这样做的方法,因为字符串操作很慢而且我实际上没有做任何与字符串相关的事情.
是否可以读取组中的位,例如3 而不是从字节中解析它们?或者有没有更有效的方法从字节中读取位?
最佳答案
二进制与和位移操作是最快的方法。它们很好地翻译成机器代码指令。进一步加快速度的唯一方法是牺牲带宽来换取速度,例如每个字节不使用超过 3 位,但从您的问题来看,您可能已经考虑并拒绝了这种权衡。
关于javascript - 如何有效地从字节中读取位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7859826/