LINUX.ORG.RU

История изменений

Исправление 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, а структуру тег + спан. А на основе тега уже можно преобразовывать к соответствующему виду.