Converting 4 Byte array into float using little endianness
-
@koahnig I have QString of 4 Byte which includes Ascii, dec and hex representation, and here I am entering hex value only then I stored this string into array using local8Bit() function of qstring.
here I am attached image of both data string and array -
here I am getting float value is -7.32957e-32 with above syntax but I am expecting value of float is -0.196638
I have check this values on online converter also https://gregstoll.dyndns.org/~gregstoll/floattohex/
,here I am getting my expected float value after changing index order of array like {0x8b,0x5b,0x49,0xbe}. as I said I have multiple 4 byte of string data and each time changing index order is not same, and sometime without changing index order of QBytearray I am getting expected float value, so I need universal solution for this. I don't know how to set index order and on which condition array order will be set..I am struggling for that. -
As said before, it is not possible to store binary data in a QString, while it is possible to do so in a QByteArray.
-
@aha_1980 Thanks for your reply here I am trying to decode .slc file, sorry I am little bit confused,Its not exaclty binary file, but includes number of floating values...
QFile slcFile(fileName); // filename is path of file.
QTextStream in(&slcFile);
QString slcText = in.readAll();I am reading all data of file and stored into string.. then trying to decode this . I have decode half file as per this above syntax successfully .. string data is little endian/Big endian scheme.
-
See http://doc.qt.io/qt-5/qstring.html#details you will find this text
*The QString class provides a Unicode character string.
QString stores a string of 16-bit QChars, where each QChar corresponds to one UTF-16 code unit. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)*
You would need to read byte by byte from QDatastream. Therefore, you need to follow @aha_1980's advice.
-
@vicksoccer
What is exact format of these floating values in the file?
If they are in binary format: "5B 49 BE 8B", then you have to use QDataStream instead QTextStream and store data in QByteArray instead QString. Or you can read data directly from the file into float:QFile slcFile(fileName); slcFile.open(QIODevice::ReadOnly); QDataStream in(&slcFile); in.setByteOrder(QDataStream::LittleEndian); in.setFloatingPointPrecision(QDataStream::SinglePrecision); float f; in >> f; ...
-
@vicksoccer You should rather use http://doc.qt.io/qt-5/qdatastream.html to read/write binary data.
-
Thanks all for your kind support!!!
Actually I am reading file which includes AScii characters. I have read all data from file and stored into QString.QFile slcFile(fileName); // filename is path of file.
QTextStream in(&slcFile);
QString slcText = in.readAll();yes I understood I can store data as QBytearray also. After storing I have process string data, But while reading data slcText does not include "\n" after end of line in QFIle. If I had open original file with texteditor (notepad++) then I was able see location of end of line .. but for many end lines slcText does not include "\n" and I need resulted string with "\n" to process. It happens same with QBytearray. If I get reading all data with "\n" my problem will be solved. Any suggestions for this...
-
@vicksoccer said in Converting 4 Byte array into float using little endianness:
Actually I am reading file which includes AScii characters
Well, in your first post you wrote "I have to read binary data from file". This is confusing at least.
So, lets make it clear: you are reading a text file - is that correct?
You can read the file without QTextStream like shown here: http://doc.qt.io/qt-5/qfile.html -
@vicksoccer If your file is mixed text/binary, you should read it as binary and process the data yourself.
Once it is converted to text only (QString), important information will be lost. So read as binary, and convert only the chunks that are known as text to QString.
Regards
-
@vicksoccer Check the link I posted...
-
@vicksoccer If the file really contains \n then you will get them when reading. How do you know it does not read them?
Also if you want read line by line use readLine(). -
@jsulm I have opened original file with texteditor(notepad++) there I can see data line by line..
But after reading file with above qt syntax the resulted QString or Qbytearray does not contain "\n" character at end of the line.
I have tried with readline() also but I am getting truncated string at wrong location ideally it comes at end line..
here my data is (opened in notpad++)
this is what I am getting in QString after readall()
here I am expecting "\n" character after index of 540.. -
@vicksoccer Can you show exact code you use to read the file?
-
@jsulm here my code is for reading file
QFile slcFile(fileName); //path of the file
if(!slcFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
showStatus("Unable to open the file\n"); //MessageBOx
return;
}
QTextStream in(&slcFile);
QString slcText = in.readAll(); //Reading data as string -
@vicksoccer And do you have an example for such a file?
Also, wasn't you question about binary float representation? How does that fit with a text file?
-
@vicksoccer said in Converting 4 Byte array into float using little endianness:
here I am expecting "\n" character after index of 540
Why? From what I could see from your screenshots this is a binary file. The fact that you can see the text in it in your notepad++ doesn't make it a text file. If you don't trust me open an executable in notepad++ and you're going to see the static strings from your program (in one way or another).
-
@aha_1980 Previously I was stucked at conversion of 4 QBytearray into float thats why I am posted with this..I am truely new in
this but now I am getting to know that my conversion is messed up due to skiping "\n" character at end line in receiving data as QString.
here is sample .slc file
https://www.dropbox.com/s/5bez93mdjr64v8x/open_display_SLC.zip -
@vicksoccer By looking at your
sample_ring2.slc
, I doubt that is a text file. It looks like pure binary data for me.