Как разделить поток данных на пакеты?
У меня есть поток данных с последовательного устройства. У меня есть это как шестнадцатеричная строка, где пакеты данных всегда начинаются с F4
,
я использую:
while (_serialPort.BytesToRead > 0)
{
var chunk = new byte[_serialPort.BytesToRead];
_serialPort.Read(chunk, 0, chunk.Length);
_text += BitConverter.ToString(chunk);
}
И как это BytesToRead
переменная чанка всегда отличается. Как я должен разделять пакеты по мере их поступления?
Я думаю:
Если строка содержит F4
, начать помещать данные в буфер. На следующем F4
, остановите, обработайте существующий буфер и начните заполнять снова.
Это жизнеспособный подход? Каков наилучший способ приблизиться к этому?
1 ответ
Стандартная практика заключается в утилизации буфера
//you should re-use the buffer
var chunk = new byte[8]; //this should be the actual packet size sent by the device
int bytesRead;
while ((bytesRead = _serialPort.Read(chunk, 0, chunk.Length)) > 0)
{
_text += BitConverter.ToString(chunk, 0, bytesRead);
}
Теперь, если ваши пакеты имеют фиксированную длину, то вы должны быть в порядке после того, как вы установите chunk[] в правильный размер. Если это не так, вы можете использовать StringBuilder для буферизации его как текста, а затем использовать обычные методы анализа строк.