Reading char array from QDataStream
-
I have a binary file from an old game Fallout 2 which contains these items (simplified):
unsigned int textSize = 3; char[textSize] text = "abc"; // next item unsigned int textSize = 6; char[textSize] text = "abcdef"; // and so on
Currently, I read the values like this:
QFile file("master.dat"); file.open(QIODevice::ReadOnly); QDataStream stream(&file); stream.setByteOrder(QDataStream::LittleEndian); for(qint32 i = 0; i < number_of_items; ++i) { qint32 length; QString text; stream >> length; for(int j = 0; j < length; ++j) { qint8 character; stream >> character; text.append(character); } qDebug() << "Text = " << text; } file.flush(); file.close();
It works fine, but it feels like I am not doing it the right way. I also tried doing this:
qint32 length; stream >> length; char *text = new char[length] stream.readRawData(text, length); qDebug() << text; delete[] text;
but when I do it like this, the text I get has some garbage at the end. For example, instead of "NAR_VC5.ACM" I get "NAR_VC5.ACMMd\u0006" which looks like I am not allocating the correct size for the string or it is missing the terminating character \0?
What is the correct way of using QDataStream for this purpose?
-
I will not go in the details of a reverse-engineered file format and just answer your question (here I'm assuming text is encoded using utf-8):
qint32 length; QByteArray rawText; QString text; stream >> length; rawText.resize(length); if(stream.readRawData(rawText.data(),length)==length){ text = QString::fromUtf8(rawText); }
-
well, you will need to make your buffers larger and NULL-terminate them youself.
Example:
char x[] = "abc";
will be NULL-terminated and the same aschar y[4] = "abc";
, whilechar z[3] = "abc";
will not be terminated as the buffer is to small.regards