我正在从二进制文件中读取,并希望插入到QList中。有没有更简单的方法来做到以下几点? (例如在一行中)
QStringList traceNames;
for(qint64 i=0; i<numTraces; i++)
{
QString name;
stream >> name;
traceNames << name;
}
stream
是QDataStream
。
我在想traceNames << stream
之类的东西(不起作用)。
答案 0 :(得分:3)
QStringList
已实现序列化运算符,但它仅适用于从QStringList
开始序列化的数据流。
QStringList l;
l << "aaa" << "bbb" << "ccc";
QBuffer buf;
QDataStream stream(&buf);
buf.open(QIODevice::ReadWrite);
stream << l;
buf.seek(0);
QStringList l1;
stream >> l1;
qDebug() << l1; // works as expected
以下是序列化QStringList
的十六进制转储,其中包含三个测试字符串:
00 00 00 03 00 00 00 06 00 61 00 61 00 61 00 00 00 06 00 62 00 62 00 62 00 00 00 06 00 63 00 63 00 63
这里只有三个测试字符串,没有QStringList
:
00 00 00 06 00 61 00 61 00 61 00 00 00 06 00 62 00 62 00 62 00 00 00 06 00 63 00 63 00 63
正如您所看到的那样,它们不同,因此您无法从未QStringList
序列化的数据流中反序列化QStringList
。
因此,如果您的二进制文件由序列化QStrings
组成,那么您已经找到了最简单的方法。
但是,请注意,除前4个字节外,两个流几乎相同。从技术上讲,您可以将这些字节前置到仅包含QString
的数据流中,并将其反序列化为QStringList
:
QByteArray rawData;
QFile f("d:\\serializedStrings.bin");
f.open(QIODevice::ReadOnly);
rawData = f.readAll();
rawData.prepend(QByteArray::fromHex("00000003"));
QBuffer buf(&rawData);
QDataStream in(&buf);
buf.open(QIODevice::ReadOnly);
QStringList slist;
in >> slist;
qDebug() << slist; // it works
虽然这是否有资格证明“简单”是有争议的......还要注意3不是一些幻数,它是字符串列表中的字符串数。这就是你的号码进入的地方。