我正在从二进制文件中读取,并想插入到 QList 中。有没有更简单的方法来执行以下操作?(例如在一行中)
QStringList traceNames;
for(qint64 i=0; i<numTraces; i++)
{
QString name;
stream >> name;
traceNames << name;
}
stream
是一个QDataStream
。
我在想类似的东西traceNames << stream
(没有用)。
QStringList
已实现序列化运算符,但它仅适用于从 aQStringList
开始序列化的数据流。
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
s 的数据流中,并将其反序列化为 a 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 不是某个幻数,它是字符串列表中的字符串数。那就是你的号码进入的地方。