解码 websocket 框架

2024-01-25

我正在尝试解码 websocket 帧,但在解码扩展有效负载时没有成功。到目前为止我所取得的成就是:

char *in = data;
char *buffer;
unsigned int i;
unsigned char mask[4];
unsigned int packet_length = 0;
int rc;

/* Expect a finished text frame. */
assert(in[0] == '\x81');
packet_length = ((unsigned char) in[1]) & 0x7f;

mask[0] = in[2];
mask[1] = in[3];
mask[2] = in[4];
mask[3] = in[5];

if (packet_length <= 125) {           **// This decoding works**
     /* Unmask the payload. */
    for (i = 0; i < packet_length; i++)
        in[6 + i] ^= mask[i % 4];
    rc = asprintf(&buffer, "%.*s", packet_length, in + 6);
} else
    if (packet_length == 126) {       **//This decosing does NOT work**
        /* Unmask the payload. */
        for (i = 0; i < packet_length; i++)
          in[8 + i] ^= mask[i % 4];
        rc = asprintf(&buffer, "%.*s", packet_length, in + 8);
}

我究竟做错了什么?如何对扩展有效负载进行编码?


症结在于负载 > 125 字节。

格式非常简单,假设您在 JavaScript 中发送十个 a:

ws.send("a".repeat(10))

然后服务器会收到:

bytes[16]=818a8258a610e339c771e339c771e339
  • 字节0:0x81只是一个消息接收的指示符
  • 字节1:0x8a是长度,减去0x80,0x0A == 10
  • 字节 2, 3, 4, 5:用于解密有效负载的 4 字节异或密钥
  • 其余:有效载荷

但现在假设您在 JavaScript 中发送 126 个 a:

ws.send("a".repeat(126))

然后服务器会收到:

bytes[134]=81fe007ee415f1e5857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574908485749084857490848574

如果有效负载的长度 > 125,则字节 1 的值为 0xfe,格式将更改为:

  • 字节0:0x81只是一个消息接收的指示符
  • 字节 1:将为 0xfe
  • 字节 2、3:作为 uint16 数字的有效负载的长度
  • 字节 4, 5, 6, 7:用于解密有效负载的 4 字节异或密钥
  • 其余:有效载荷

C# 中的示例代码:

List<byte[]> decodeWebsocketFrame(Byte[] bytes)
{
    List<Byte[]> ret = new List<Byte[]>();
    int offset = 0;
    while (offset + 6 < bytes.Length)
    {
        // format: 0==ascii/binary 1=length-0x80, byte 2,3,4,5=key, 6+len=message, repeat with offset for next...
        int len = bytes[offset + 1] - 0x80;

        if (len <= 125)
        {

            //String data = Encoding.UTF8.GetString(bytes);
            //Debug.Log("len=" + len + "bytes[" + bytes.Length + "]=" + ByteArrayToString(bytes) + " data[" + data.Length + "]=" + data);
            Debug.Log("len=" + len + " offset=" + offset);
            Byte[] key = new Byte[] { bytes[offset + 2], bytes[offset + 3], bytes[offset + 4], bytes[offset + 5] };
            Byte[] decoded = new Byte[len];
            for (int i = 0; i < len; i++)
            {
                int realPos = offset + 6 + i;
                decoded[i] = (Byte)(bytes[realPos] ^ key[i % 4]);
            }
            offset += 6 + len;
            ret.Add(decoded);
        } else
        {
            int a = bytes[offset + 2];
            int b = bytes[offset + 3];
            len = (a << 8) + b;
            //Debug.Log("Length of ws: " + len);

            Byte[] key = new Byte[] { bytes[offset + 4], bytes[offset + 5], bytes[offset + 6], bytes[offset + 7] };
            Byte[] decoded = new Byte[len];
            for (int i = 0; i < len; i++)
            {
                int realPos = offset + 8 + i;
                decoded[i] = (Byte)(bytes[realPos] ^ key[i % 4]);
            }

            offset += 8 + len;
            ret.Add(decoded);
        }
    }
    return ret;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解码 websocket 框架 的相关文章

随机推荐

  • 如何解析某些标签中带有冒号的 XML?

    我一直在阅读一些教程XmlPullParser在Android中如何解析XML数据 更具体地说 我使用的 XMLhttps gdata youtube com feeds api standardfeeds top rated 在这里 我简
  • 跳过 JavaScript 数组的 take 方法

    是否有方法可以跳过特定数量的对象并从 JavaScript 数组中获取一定数量的对象 基本上我正在寻找的模式是这样的 假设我有一个包含 8 个对象的数组 第一个循环 从数组中返回索引 0 到 3 处的对象 第二个循环 从数组中返回索引 4
  • 为什么golang RGBA.RGBA()方法使用|和<<?

    在golang color包中 有一个方法可以从an中获取r g b a值RGBA object func c RGBA RGBA r g b a uint32 r uint32 c R r r lt lt 8 g uint32 c G g
  • Apache CXF 和 servlet 映射

    我正在尝试学习 Apache CXF 的一些基础知识以及有关 servlet 映射的一般知识 我在这里修改了代码 https subversion assembla com svn pablo examples spring cxf exa
  • 使用 lodash 的 isEqual() 在比较中排除一些属性

    我在用 是平等的 https lodash com docs isEqual它比较 2 个对象数组 例如 每个对象 10 个属性 并且工作正常 现在有 2 个属性 创建和删除 我不需要成为比较的一部分 Example var obj1 na
  • 如何将第一个孩子移到最后?

    我在 div 容器中有一些 div 项目 我想连续地为它们设置动画 我知道如何在无限循环中运行我的函数 但是选择第一个 div 对其进行动画处理并在完成动画后将其移动到末尾存在问题 我的函数如下所示 function MoveItems c
  • 将 XAML 行为附加到相同类型的所有控件

    我有一个InvokeCommandAction我所拥有的附加到GotFocus的事件TextBox像这样
  • Laravel 将文件上传到项目目录之外的不同存储

    我正在创建一个 CMS 其中我可以使用 Laravel 的文件上传来上传文件 照片 pdf 等 我所做的不同之处在于 我想将文件存储在 CMS 项目目录之外 比如说我网站的存储文件夹 顺便说一句 我正在创建两个不同的项目 Laravel 文
  • CFG 在 NLTK 中使用 POS 标签 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 针对特定包的自定义意图

    假设我的应用程序是 A 我使用应用程序 A 中的自定义意图启动应用程序 B 的活动 它工作得很好 正如我所希望的那样 我使用的代码是在应用程序 B 的清单中
  • 使用 printf 格式化输出:截断或填充

    我想产生以下输出 gt Avril Stewart 99 54 gt Sally Kinghorn 170 60 gt John Young 195 120 gt Yutte Schim 250 40 如您所见 短于 14 个字符的名称会用
  • 接收 zip 文件,angularJs

    当我想从 Rest api 下载 zip 文件时遇到问题 当 zip 文件从我的服务器 带有球衣 传输时 我收到的文件已损坏 我已经尝试过responseType arraybuffer 在我的 http 请求上 但它没有解决任何问题 这是
  • 类似 XPath 的嵌套 Python 字典查询

    有没有办法为嵌套 python 字典定义 XPath 类型查询 像这样的事情 foo spam eggs morefoo bar soap morebar bacon foobar print foo select morefoo more
  • “constexpr if”与“if”的优化 - 为什么需要“constexpr”?

    C 1z 将引入 constexpr if 根据条件删除一个分支的 if 看起来合理且有用 但是 没有 constexpr 关键字就不可能了吗 我认为在编译期间 编译器应该知道编译期间是否已知条件 如果是的话 即使是最基本的优化级别也应该删
  • 更改 jquery 工具提示箭头的位置

    我正在尝试将箭头的位置更改为文本框附近的左侧 我怎样才能解决这个问题 我已经尝试过这个 工作示例链接 http jsfiddle net b8fcg http jsfiddle net b8fcg HTML
  • Java EE 6 发布日期 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Java
  • 用于操作 S-Record 和 Intel HEX 16 文件的库

    是否有可用的开源库 用 python 或 java 开发 用于操作 Motorola S Record 文件和 Intel HEX 16 文件 例如从一种格式转换为另一种格式 我正在寻找一个 纯 java或python库 而不仅仅是一组ja
  • RecyclerView 回收时出现问题

    我有一个我使用创建的项目列表RecyclerView 当用户单击其中之一时 我会更改所选项目的背景颜色 问题是 当我滚动浏览我的项目并回收它们时 某些项目会获得所选项目的背景颜色 这是错误的 在这里你可以看到我的Adapter s code
  • 用字典解析字符串的算法

    Given 一本充满单词的字典 in july den dentist best 使用一些 C API 来访问它 boolean findWord string word or string getNextWord void 迭代它 一些没
  • 解码 websocket 框架

    我正在尝试解码 websocket 帧 但在解码扩展有效负载时没有成功 到目前为止我所取得的成就是 char in data char buffer unsigned int i unsigned char mask 4 unsigned