从 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 不是某个幻数,它是字符串列表中的字符串数。那就是你的号码所在的地方。