Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bolonat от Июнь 07, 2018, 19:31



Название: QByteArray перевести в float
Отправлено: Bolonat от Июнь 07, 2018, 19:31
Здравствуйте! Qt Creator 4.5.0 Qt 5.10.0

По модбасу получаю данные, формирую из них массив байт. Из этого массива последовательно выделяю подмассивы и читаю из них значения нужного мне типа, применяя QDataStream.
Не получается из QByteArray получить float.
Делаю следующее:

Код:
   QByteArray ar4=one_ch.mid(64,4);
   float r=0.0;
   QDataStream stream4(ar4);
   //поскольку байты местами менять не нужно, оставляю флаг по умолчанию - QDataStream::BigEndian
    stream4.setFloatingPointPrecision(QDataStream::SinglePrecision);
    stream4>>r;

 Под отладчиком вижу элементы ar4:
 ar4[0]=0x00
 ar4[1]=0x00
 ar4[2]=0x41
 ar4[3]=0x20

Должно получиться 10.0 (По крайней мере, это значение отображается в Modbus Poll), но  получаю всякую чушь.
Что я делаю не так?

Пробую тот же массив считать по-другому:
Код:
    float v=0.0;
    memcpy(&v, ar4.data(), sizeof(float));

или

Код:
    float z = *(reinterpret_cast<const float*>(ar4.constData()));
и тоже в результате получаю ерунду.


Название: Re: QByteArray перевести в float
Отправлено: RedDog от Июнь 07, 2018, 20:12
первый байт код ф-ции, дальше идут данные
весьма вероятно, во флоат надо укладывать начиная со 2-го (1-го, мыж программисты) байта

Код:
memcpy(&v, ar4.data() + 1, sizeof(float));


Название: Re: QByteArray перевести в float
Отправлено: Igors от Июнь 08, 2018, 04:50
  //поскольку байты местами менять не нужно, оставляю флаг по умолчанию - QDataStream::BigEndian
Это как раз обмен


Название: Re: QByteArray перевести в float
Отправлено: Bolonat от Июнь 08, 2018, 11:38
Спасибо большое. Просто подмассив был выделен неправильно. Надо было сдвижку сделать на два байта:
 QByteArray ar4=one_ch.mid(66,4);

 Тогда:
 ar4[0]=0x41
 ar4[1]=0x20
 ar4[2]=0x00
 ar4[3]=0x00

В результате получаю 10.