了解此WebSocket框架解析代码

时间:2020-02-18 22:20:01

标签: javascript node.js websocket binary bit-manipulation

这里的初学者试图从低层次了解websocket的工作方式。我正在尝试创建自己的实现,但是我对解析从client => server发送来的数据帧的逻辑感到非常困惑。

我知道在服务器端接收到的缓冲区由多个字节组成,其中前两个是主要标头信息(fin位,长度,操作码,掩码等)。

我在SO上找到了以下代码,可以解析这两个字节,并且从测试来看,它确实返回了正确的值。

let index = 0;
frame = {
    data: new Buffer(0),
    fin: (buffer[index] & 128) === 128,
    length: buffer[index + 1] & 127,
    masked: (buffer[index + 1] & 128) === 128,
    opcode: buffer[index] & 15
}

我主要的问题是什么......这到底是如何返回正确的值?

我知道buffer [index]和buffer [index + 1]分别指的是第一个字节和第二个字节,并且AND操作数用于比较每个字节的二进制值,并且当两个数字中的两个索引相等时输出1到1,否则为0 ......但是...

&运算符后面的数字从哪里来?例如:操作码为15,长度为127。

在这两个值上使用AND运算符究竟能给出正确的结果吗?这是我真的不明白。

对于这是我不了解的基本计算机科学概念,我深表歉意,但是如果在那里有人能够向我解释此代码的确切含​​义,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我知道它看起来像是一个普通的AND比较,但它是布尔布尔AND比较。

为更明确一点,操作码的buffer [index]和15表示将buffer [index]的二进制数与15(这是websocket允许的最高操作码)的二进制数进行比较,并逐位返回二进制结果以整数形式显示,操作码本身会告诉您正在发送哪种帧类型。(如果您好奇,可以在https://tools.ietf.org/html/rfc6455#section-11.8进行深入了解。)

在127的长度部分,我会在SO上引用此答案,因为它是一个可靠的答案:how to work out payload size from html5 websocket

要进一步了解运算符,请参阅我的资料中有关按位逻辑运算符的部分。

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators