从 QDataStream 轻松读出到 QStringList
Easy readout from QDataStream to 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 个字节外,这两个流几乎完全相同。从技术上讲,您可以将这些字节添加到仅包含 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
虽然这是否符合 "easy" 是有争议的...还要注意 3 不是某个幻数,它是字符串列表中的字符串数。那就是你的号码所在的地方。
我正在读取一个二进制文件,并想插入到一个 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
的数据流中,并将其反序列化为 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
虽然这是否符合 "easy" 是有争议的...还要注意 3 不是某个幻数,它是字符串列表中的字符串数。那就是你的号码所在的地方。