История изменений
Исправление Ivan_qrt, (текущая версия) :
Ну тогда как вариант делать структуру с методом next(), который будет возвращать span на следующую пачку данных.
class Msg {
public:
Msg(span<const uint8_t> recv): m_raw{recv}, m_pos{0} {}
span<const uint8_t> next() {
if (m_pos >= m_raw.size()) {
return {};
}
size_t size = m_raw[m_pos++];
if (m_pos + size > m_raw.size()) {
return {};
}
auto res = span{&m_raw[m_pos], size};
m_pos += size;
return res;
}
private:
span<const uint8_t> m_raw;
size_t m_pos;
};
Заголовок пакета можно так же структурой оставить, как выше, если он есть и постоянен.
Если есть теги, обозначающие типы данных, то из next
возвращать не span, а структуру тег + спан. А на основе тега уже можно преобразовывать к соответствующему виду.
Исходная версия Ivan_qrt, :
Ну тогда как вариант делать структуру с методом next(), который будет возвращать span на следующую пачку данных.
class Msg {
public:
Msg(span<const uint8_t> recv): m_raw{recv}, m_pos{0} {}
span<const uint8_t> next() {
if (m_pos >= m_raw.size()) {
return {};
}
size_t size = m_raw[m_pos++];
if (m_pos + size > m_raw.size()) {
return {};
}
return span{&m_raw[m_pos], size};
}
private:
span<const uint8_t> m_raw;
size_t m_pos;
};
Заголовок пакета можно так же структурой оставить, как выше, если он есть и постоянен.
Если есть теги, обозначающие типы данных, то из next
возвращать не span, а структуру тег + спан. А на основе тега уже можно преобразовывать к соответствующему виду.