栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在WebSockets hybi 08+中解构数据帧?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在WebSockets hybi 08+中解构数据帧?

(另请参见:如何在服务器端发送和接收WebSocket消息?)


这很容易,但是了解格式很重要。

第一个字节几乎始终是

10000001
,其中的
1
意思是“最后一帧”,三个
0
s是保留位,到目前为止没有任何意义
0001
,也意味着它是一个文本框架(Chrome使用该
ws.send()
方法发送)。

更新:
Chrome现在还可以发送带有的二进制帧

ArrayBuffer
。第一个字节的后四位是
0002
,因此您可以在文本数据和二进制数据之间进行区别。数据的解码方式完全相同。)

第二个字节包含一个

1
(表示已被“屏蔽”(编码)),后跟七个代表帧大小的位。如果介于
000 0000
和之间
1111101
,则为大小。如果为
111 1110
,则后面的2个字节为长度(因为它不适合7个位),如果为
1111111
,则下面的8个字节为长度(如果不适合两个字节)。

接下来是四个字节,它们是解码帧数据所需的“掩码”。这是使用异或编码完成的,异或编码使用

indexOfByteInData mod4
数据定义的掩码之一。解码简单工作方式类似
enpredByte xormaskByte
(如果
maskByte
indexOfByteInData mod 4
)。

现在我必须说我完全没有C#经验,但这是一些伪代码(恐怕有些Javascript口音):

var length_pre = bytes[1] & 127, // remove the first 1 by doing '& 127'    masks,    data;if(length_pre === 126) {    masks = bytes.slice(4, 8);   // 'slice' returns part of the byte array    data  = bytes.slice(8);      // and accepts 'start' (inclusively)} else if(length_pre === 127) { // and 'end' (exclusively) as arguments    masks = bytes.slice(10, 14); // Passing no 'end' makes 'end' the length    data  = bytes.slice(14);     // of the array} else {    masks = bytes.slice(2, 6);    data  = bytes.slice(6);}// 'map' replaces each element in the array as per a specified function// (each element will be replaced with what is returned by the function)// The passed function accepts the value and index of the element as its// argumentsvar depred = data.map(function(byte, index) { // index === 0 for the first byte    return byte ^ masks[ index % 4 ];          // of 'data', not of 'bytes'    //         xor mod});

您还可以下载可能会有所帮助的规范(它当然包含了解格式所需的所有内容)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号