我正在尝试编写一个函数来解码通过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,因此不必担心处理其他字节)
答案 0 :(得分:0)
通过修改this post中的函数,我可以使它工作:
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;
}
}