Понимание этого кода синтаксического анализа фрейма - PullRequest
1 голос
/ 19 февраля 2020

Здесь начинающий пытается на низком уровне понять, как работают веб-сокеты. Я пытаюсь создать свою собственную реализацию, однако я очень запутался в логике c синтаксического анализа фрейма данных, полученного с клиента => сервера.

Я знаю буфер, полученный на сервере сторона состоит из нескольких байтов, причем первые два являются основной информацией заголовка (бит fin, длина, код операции, маска и т. д. c).

Я нашел следующий код в SO, который анализирует оба байта, и после тестирования он действительно возвращает правильные значения.

let index = 0;
frame = {
    data: new Buffer(0),
    fin: (buffer[index] & 128) === 128,
    length: buffer[index + 1] & 127,
    masked: (buffer[index + 1] & 128) === 128,
    opcode: buffer[index] & 15
}

Какой мой главный вопрос, хотя .... КАК именно это возвращает правильные значения?

Я знаю буфер [ index] и buffer [index + 1] ссылаются на первый и второй байт, а операнд AND используется для сравнения двоичных значений каждого и вывода 1, когда оба индекса в обоих числах равны 1, в противном случае 0 .. .... но ...

Откуда приходят цифры после оператора &? пример: код операции 15, длина 127.

КАК точно использование оператора AND для обоих этих значений дает правильный результат? Это то, чего я действительно не понимаю.

Я прошу прощения, если это базовые c концепции информатики, которые я не понимаю, но если кто-нибудь там сможет объяснить мне, что именно происходит с этим кодом это было бы очень ценно.

1 Ответ

0 голосов
/ 21 февраля 2020

Я понимаю, что это выглядит как нормальное сравнение AND, но скорее это логическое сравнение AND.

Чтобы прояснить чуть более детально c, буфер [index] & 15 для кода операции говорит сравнение Буферизуйте [index] как двоичное число с 15 (это максимальный разрешенный код операции для веб-сокетов) как двоичное число побитно и возвращайте двоичные результаты в виде целого числа, сам код операции сообщает, какой тип кадра отправляется. (Если вы Любопытно, что вы можете глубоко погрузиться в это здесь https://tools.ietf.org/html/rfc6455#section -11,8 .)

В части длины 127 я обращаюсь к этому ответу на SO, так как это ответ solid: как определить размер полезной нагрузки из html5 websocket

Для получения дополнительной информации об операторе см. Раздел моего источника о побитовых логических операторах.

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators

...