javascript - 如何有效地从字节中读取位?

标签 javascript parsing node.js byte bit-manipulation

我正在开发一个包含 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/

相关文章:

node.js - 使用bunyan.createLogger 启动时调试中断 - Node v5.8

javascript - Jquery 日期选择器函数

javascript - 将 JQuery 验证与 JQuery 自动完成相结合

javascript - 后台 HTML 监听器

java - 在基于 Java 文本的游戏中解析命令的最佳方式

node.js - 如何调试nodejs项目?

javascript - 使用 JavaScript 计算字符串中元音的个数

javascript - 如何使用 Angular JS 将数据从 json 转换为对象列表

json - 在 Swift 中从 OpenWeatherMap 解析 JSON

mongodb - nodejs - mongodb - 无法调用 null 的方法 'collection'