获取特定的帧位
鳍片
bool fin = (data[0] & 128) == 128;
操作码
int opCode = data[0] & 15;
是蒙面的
bool isMasked = (data[1] & 128) == 128;
数据长度
int dataLength = data[1] & 127;
Websocket框架概述
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
有关如何获取字节的特定位的一般信息
示例:获取 FIN 位
首先写下第一个字节的二进制表示,假设第一位是130
,所以1000 0010
在二进制或更易于理解的 Fin 位集和二进制数据的操作码 2 中。如果您想要获得最重要的位,您需要使用逻辑 AND (&) 运算符和128
( 1000 0000
in Binary)。
所以基本上 1 和 1 将是 1,其他一切都将是 0。
1000 0010 -> First Byte
1000 0000 -> Our Masking Byte => 128 in Decimal
---------
1000 0000 -> Resulting Byte => 128 in Decimal (Fin bit set)
另一个示例 Fin 位未设置和文本数据。
0000 0001 -> First Byte
1000 0000 -> Our Masking Byte -> 128 in Decimal
---------
0000 0000 -> Resulting Byte => 0 in Decimal (Fin bit not set)
示例:获取 OpCode(OpCode 告诉您此帧的用途)
OpCode 可以从第一个字节的前 4 位收集。假装 FIN 位已设置且 OpCode 为 Text。
1000 0001 -> First Byte
0000 1111 -> Our Masking Byte => 15 in Decimal
---------
0000 0001 -> Resulting Byte => 1 in Decimal (Text OpCode)