从QDataStream轻松读出到QStringList



我正在从二进制文件中读取,并想插入到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 个字节外,这两个流几乎相同。从技术上讲,您可以将这些字节附加到仅包含QStrings 的数据流中,并将其反序列化为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 不是什么幻数,它是字符串列表中的字符串数。这就是你的号码进入的地方。

相关内容

  • 没有找到相关文章

最新更新