【问题标题】:Nodejs Buffer: How to read out bit flags?Nodejs Buffer:如何读出位标志?
【发布时间】:2012-12-20 08:41:13
【问题描述】:

我正在侦听 tcp 套接字上的数据事件。

每个数据事件都为我提供了一个缓冲区,它是协议的一个帧。 第一个字节用作标题并包含一些我想访问的位标志。

直到那里监听数据事件并获得第一个字节:

socket.on('data', function(buff) {
    console.log(buff[0]); // returns 129
});

如果我现在要检查第一个位,那么我必须将 129 转换为位格式,然后检查第一个数字。

129 => 1000 0001
       |

我们知道 JavaScript 不支持二进制文件。

我现在想知道节点缓冲区对象是否允许我明智地工作,如果可以,这会是什么样子?

问候

【问题讨论】:

标签: javascript node.js sockets binary buffer


【解决方案1】:

可以使用& 运算符检查标志。

对于包含第一位的标志:

1000 0001      129
1000 0000      128
--------- &
1000 0000      128

对于不包含第一位的标志:

0101 0001      81
1000 0000      128
--------- &
0000 0000      0

所以结果要么是标志(如果已设置标志)或为零(如果尚未设置标志)。因此,您可以创建一个函数(其中flag 是 2 的幂):

var containsFlag = function(number, flag) {
  return (number & flag) === flag;
};

containsFlag(129, 128);  // true
containsFlag(81, 128);   // false

【讨论】:

  • 使用例如 ascii 而不是 dezimal 编码实际上更好吗?
  • @kyogron:什么意思?
  • 也可以执行 (0x2 & 0xA) == 0x2 (因此仅使用十六进制值)。是否有任何性能提示可以使用特定编码而不是另一个?
  • @kyogron: 0x2 表示与2 完全相同的数字。两者都可以表示为纯整数,因此计算速度应该一样快。
猜你喜欢
  • 2017-12-12
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多