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); }
-
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?
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