QByteArray to float value
-
Hello,
from a TCP Socket i get 4 bytes representing a float value in the IEEE 754 standard.For example:
QByteArray arr = socket->read(4); // arr.at(0) = 0x41 // arr.at(1) = 0xf8 // arr.at(2) = 0xf6 // arr.at(3) = 0x00
Is there an easy way to convert it? For double values i use the QDataStream like
QByteArray arr = socket->read(8); double number; QDataStream(arr); stream >> number;
But this won't work with float values.
I have also tried
bool ok = false; float val = socket->read(4).toFloat(&ok); // ok = false!
Thanks you
-
Hi
Are you sure the input is correct?
ToFloat should work
http://doc.qt.io/qt-5/datastreamformat.htmlfloat 32-bit floating point number using the standard IEEE 754 format
Are you using QDataStream in the other end to send it so endianness is being handled for you ?
-
@mrjj
From this converter: https://www.h-schmidt.net/FloatConverter/IEEE754.html 0x41f8f600 in decimal is 31.120117QByteArray arr; arr.resize(4); arr[0] = 0x41; arr[1] = 0xf8; arr[2] = 0xf6; arr[3] = 0x00; float val; QDataStream stream(arr); stream >> val; qDebug() << val; // val = 0
No i don't convert the number. I just read them from the socket.
-
@mrjj
From this converter: https://www.h-schmidt.net/FloatConverter/IEEE754.html 0x41f8f600 in decimal is 31.120117QByteArray arr; arr.resize(4); arr[0] = 0x41; arr[1] = 0xf8; arr[2] = 0xf6; arr[3] = 0x00; float val; QDataStream stream(arr); stream >> val; qDebug() << val; // val = 0
No i don't convert the number. I just read them from the socket.
So
Yes, you are using QDataStream in both ends.And you have checked that each byte contains the same
values when read in again as when sent? -
So
Yes, you are using QDataStream in both ends.And you have checked that each byte contains the same
values when read in again as when sent?No, i'm sorry, i'm not good in explaining. An external device sends status information through the tcp socket.
From the manual of the device i know that the value is a floating number represented by 4 bytes. The value is displayed on the device (so i know what it should be, when i read it).
The bytearray which i read is
QByteArray arr = socket->read(4); // arr.at(0) = 0x41 // arr.at(1) = 0xf8 // arr.at(2) = 0xf6 // arr.at(3) = 0x00
When i convert the read QByteArray with the QDataStream i get zero (but thats not the value displayed on the device). So i convert the QByteArray with the online converter (https://www.h-schmidt.net/FloatConverter/IEEE754.html) and get the correct value. So i thought i do not use the QDataStream class correctly. But from the same device i get also values with double precesion (8 bytes). Converting these values with QDataStream is no problem, only float values
-
Hello,
from a TCP Socket i get 4 bytes representing a float value in the IEEE 754 standard.For example:
QByteArray arr = socket->read(4); // arr.at(0) = 0x41 // arr.at(1) = 0xf8 // arr.at(2) = 0xf6 // arr.at(3) = 0x00
Is there an easy way to convert it? For double values i use the QDataStream like
QByteArray arr = socket->read(8); double number; QDataStream(arr); stream >> number;
But this won't work with float values.
I have also tried
bool ok = false; float val = socket->read(4).toFloat(&ok); // ok = false!
Thanks you
@beecksche
You can use QDataStream for float too. Just have to set this option:stream.setFloatingPointPrecision(QDataStream::SinglePrecision); // for float (4-bytes / 32-bits)
or
stream.setFloatingPointPrecision(QDataStream::DoublePrecision); // for double (8-bytes / 64-bits)
Default value is QDataStream::DoublePrecision. That's why in your case it works with double, and not with float.
-
@beecksche
You can use QDataStream for float too. Just have to set this option:stream.setFloatingPointPrecision(QDataStream::SinglePrecision); // for float (4-bytes / 32-bits)
or
stream.setFloatingPointPrecision(QDataStream::DoublePrecision); // for double (8-bytes / 64-bits)
Default value is QDataStream::DoublePrecision. That's why in your case it works with double, and not with float.