Я пытаюсь написать функцию для декодирования маскированного буфера, отправленного на сервер узла через соединение 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, поэтому не нужно беспокоиться об обработке дополнительных байтов)