В спеках пакетов с данными от некоторой железки написано «Первые 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) вместо нормальных данных получается какой-то непонятный забор, будто от переполнения буфера.
Я почти уверен, что проблема не в моём коде, а в железке, но вдруг ЛОР заметит здесь некий невидимый моим привыкшим к высокоуровневому программированию глазам косяк?