当前位置: 首页 > 知识库问答 >
问题:

解码WebSocket掩码

颜光临
2023-03-14

我试图编写一个函数来解码通过WebSocket连接发送到节点服务器的屏蔽缓冲区。结合使用RFC6455和一些旧的SO答案,这就是我迄今为止所做的:

function decodeMessage(buffer) {

    const opCode = buffer.readUInt8(0) & 0xF;

    if(opCode === 0x1) {
        const data_length = buffer.readUInt8(1) & 0x7F;
        let decoded = Buffer.alloc(data_length);

        const mask_key = buffer.readUInt32BE(2);

        for (let i = 0; i < data_length; i++) {
            decoded[i] = buffer.readUInt8(i) ^ mask_key[i % 4];
        }

        buffer.copy(decoded, 0, 2);

        return decoded.toString('utf8');

    } else {
        return null;
    }
}

代码有两个问题:

>

  • 它不能正确地揭开消息掩码,只是输出乱码Unicode

    它每次输出不同的解码消息,即使输入是恒定的

    (有效负载长度永远不会超过126,因此不需要担心处理额外的字节)

  • 共有1个答案

    呼延英奕
    2023-03-14

    通过修改本文中的一个函数,我能够实现以下功能:

    function decodeMessage(buffer) {
    
        if((buffer.readUInt8(0) & 0xF) === 0x1) {
            const length = (buffer.readUInt8(1) & 0x7F)+4;
    
            let currentOffset = 2;
            const mask_key = buffer.readUInt32BE(2);
    
            const data = Buffer.alloc(length);
    
            for (let i = 0, j = 0; i < length; ++i, j = i % 4) {
                const shift = j === 3 ? 0 : (3 - j) << 3;
    
                const mask = (shift === 0 ? mask_key : (mask_key >>> shift)) & 0xFF;
                const source = buffer.readUInt8(currentOffset++);
                data.writeUInt8(mask ^ source, i);
            }
    
            return data.toString('utf8');
    
        } else {
            return null;
        }
    }
    
     类似资料:
    • 介绍 Cpumasks 是Linux内核提供的保存系统CPU信息的特殊方法。包含 Cpumasks 操作 API 相关的源码和头文件: include/linux/cpumask.h lib/cpumask.c kernel/cpu.c 正如 include/linux/cpumask.h 注释:Cpumasks 提供了代表系统中 CPU 集合的位图,一位放置一个 CPU 序号。我们已经在 Ker

    • 问题内容: 我有以下几点: 我想了解如何计算得出以下结果,例如: 12414 我对位掩码的工作原理一无所知,如果有人能给出一些提示并解释它如何达到这个数字,我将不胜感激。 问题答案: 该表达式等效于2的n次幂。 您撰写本文时,只要和相同,就不同。因此,您可以根据需要以简单的添加方式来考虑它。 数以二进制是所以它是下列标志的总和(或按位OR): 请注意,当从右到左读取时,包含的标志对应于在12414

    • 我试着像上面那样设置面具,但不起作用。

    • 我有一个spring Fox Swagger UI,在那里我执行了许多操作,其中之一是发布到Jira,它要求用户输入他们的用户名和密码。 这个问题是密码不掩码。 我添加了,但没有任何区别。 有什么想法吗?

    • 我用的是甜警报2(https://sweetalert2.github.io/)-react组件,我需要在第二步使用(千分隔符和前缀=“$”)屏蔽输入。是否可能? 这里有些代码 我不知道如何控制这一切。谢谢你的帮助

    • 在 Cocos Creator 3D 中,部分物理组件(目前有刚体组件和碰撞器组件)提供了设置分组和掩码的接口。 共享 在 Cocos Creator 3D 中,目前物理元素和节点是一对一的关系,分组和掩码是属于物理元素的,单个节点上的物理组件修改的都是节点对应物理元素的分组和掩码。 原理 只要以下条件为真就会进行检测 (GroupA & MaskB) && (GroupB & MaskA) 例