В спеках пакетов с данными от некоторой железки написано «Первые 8 байт отбрасываются, а далее идёт 150 чисел. Числа записаны как беззнаковые целые по 3 беззнаковых байта в big endian (старший, средний, младший). Значение отсчёта умножаем на цену деления (2.5v/0xFFFFFF) и вычитаем середину шкалы (1.25v)». Я получаю массив char'ов (QByteArray) и далее для получения всех чисел делаю следующее:
static double SomeClass::getOneReading(QByteArray::ConstIterator &it)
{
    const unsigned char b1 = *(it++);
    const unsigned char b2 = *(it++);
    const unsigned char b3 = *(it++);
    // Не преобразованное показание АЦП
    const quint32 block =
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
            (b1 << 24) +
            (b2 << 16) +
            (b3 << 8);
#else
            b3 +
            (b2 << 8) +
            (b1 << 16);
#endif
    /// Цена деления (коэффициент перевода показаний АЦП в напряжение)
    static const double delta = 2.5 / 0xFFFFFF;
    /// Середина шкалы
    static const double Vcm = 1.25;
    return double(block) * delta - Vcm;
}
void SomeClass::processRecord(const QByteArray &recordDatagram)
{
    QList<double> readings;
    readings.reserve(150);
    // Первые 8 байт нас интересуют
    QByteArray::ConstIterator it = recordDatagram.constBegin();
    for (int i = 0; i < 8; ++i) {
        ++it;
    }
    // Нам интересны 450 байт из пакета с данными
    QByteArray::ConstIterator end = it;
    for (int i = 0; i < 450; ++i) {
        ++end;
    }
    while (it != end) {
        Q_ASSERT(it < end);
        readings << getOneReading(it);
    }
    emit gotRecord(readings);
}
Здесь всё правильно, или же вкралась некая ошибка? Я спрашиваю потому, что производитель железки, данные с которой я обрабатываю, катит на меня бочку, что я, мол, неправильно обрабатываю данные, а потому с некоторой периодичностью получается чушь вместо правильных данных.
Косяк заключается в том, что раз в N пакетов (N~=20-30) вместо нормальных данных получается какой-то непонятный забор, будто от переполнения буфера.
Я почти уверен, что проблема не в моём коде, а в железке, но вдруг ЛОР заметит здесь некий невидимый моим привыкшим к высокоуровневому программированию глазам косяк?







