2

你如何解码websocket中的延续帧?有人可以给我一个有用的见解吗?将延续框架解码为文本框架会导致错误。

我正在向服务器发送一个大文本字符串,我只能设法解码第一个传入的文本帧,然后失败。

这是nodejs中处理文本帧解码的一个简单函数 -

function decodeWS(data)
{
    var dl = data[1] & 127;
    var ifm = 2;
    if (dl == 126) 
    {
        ifm = 4;
    } else if (dl == 127) 
    {
        ifm = 10;
    }
    var i = ifm + 4;
    var masks = data.slice(ifm,i);
    var index = 0;
    var output = "";
    var l=data.length;
    while (i < l) 
    {
        output += String.fromCharCode(data[i++] ^ masks[index++ % 4]);
    }
    return output;
}
4

1 回答 1

5

获取特定的帧位

鳍片

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 0000in 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)
于 2017-01-06T23:14:26.543 回答