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