gpt4 book ai didi

javascript - 在 websocket 中解码延续帧

转载 作者:行者123 更新时间:2023-11-29 22:14:54 27 4
gpt4 key购买 nike

如何解码 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;
}

最佳答案

获取特定的帧位

芬比特

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。如果您想要获得最高有效位,您需要对 128(二进制中的 1000 0000)使用逻辑 AND (&) 运算符。

所以基本上 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 为文本。

1000 0001 -> First Byte
0000 1111 -> Our Masking Byte => 15 in Decimal
---------
0000 0001 -> Resulting Byte => 1 in Decimal (Text OpCode)

关于javascript - 在 websocket 中解码延续帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15770079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com