Поиск данных в кадрах в байтовом массиве - PullRequest
0 голосов
/ 03 июня 2011

У меня есть байт-массив, состоящий из данных, полученных от WebSocket-клиента.Данные, которые у меня есть, могут быть либо 1 приемными, либо буферизованными данными + последний прием.Это зависит от погоды или от того, были ли буферизованы какие-либо данные.

Теперь, на самом деле, есть 3 возможных вещи, которые должны произойти при получении данных, и они следующие (обратите внимание, это после того, как я объединилполученные данные с буфером):

  1. Частичное сообщение получено: Клиент начал передавать сообщение, и через него прошли только части сообщения (начало)еще.Полученные данные необходимо буферизовать до получения остальных.
  2. Получено целое сообщение: Клиент передал целое сообщение.Событие должно быть запущено с сообщением.
  3. Получен сигнал закрытия: Клиент отправил запрос на закрытие сигнала.

Сейчаснет веской причины, по которой несколько таких событий не должно происходить одновременно (например, получено полтора сообщения или получено одно сообщение и сигнал закрытия).Сообщения в веб-сокете обрамляются байтами 0x00 и 0xFF, другими словами, входящие сообщения выглядят так: 0x00,...binary UTF8 data,0xFF,0x00,...binary UTF8 data,0xFF, а сигнал окончания выглядит так: 0xFF,0x00.Теперь мне нужен эффективный способ взять входящий поток данных и разделить его на сообщения или конечный сигнал.Я никогда раньше не работал с такими данными в рамке, поэтому не уверен, как это сделать эффективно.Что я хотел бы, так это более или менее функция, которая принимает двоичные данные в виде массива и возвращает сообщения (в виде двоичных данных без фрейма) или флаг закрытия, а также байтовый массив с данными, подлежащими буферизации.Важно то, что это быстро и не потребляет слишком много ненужной памяти.Или, если у вас есть ссылки, которые могут помочь мне решить эту проблему, я с радостью приму их.

1 Ответ

0 голосов
/ 03 июня 2011

Ваш сигнал закрытия - это просто пустое сообщение, а не особый случай.

Итак, у вас есть несоответствие между отрезками по линии и интерпретируемыми сообщениями.

Это не выглядит так сложно, вы должны извлечь последовательности от 0x00 до 0xFF из потока байтов.Вам понадобится буфер, который больше, чем самое большое сообщение, вам нужно будет отсканировать все входящие байты, извлечь полные сообщения и переместить остаток «вниз» в буфер.

Вам также потребуется:

  • для проверки того, что ваши данные UTF8 не могут содержать 0x00 или 0xFF, я не уверен, что это правда
  • обрабатывать случай, когда за 0xFF следует что-то еще, кроме 0x00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...