1

我正在从二进制文件中读取,并想插入到 QList 中。有没有更简单的方法来执行以下操作?(例如在一行中)

QStringList traceNames;

for(qint64 i=0; i<numTraces; i++)
{
  QString name;
  stream >> name;
  traceNames << name;
}

stream是一个QDataStream

我在想类似的东西traceNames << stream(没有用)。

4

1 回答 1

3

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

如您所见,它们是不同的,因此您无法从未QStringListQStringList.

因此,如果您的二进制文件是由序列化的,QStrings那么您已经找到了最直接的方法。

但是,请注意,除了前 4 个字节外,这两个流几乎相同。从技术上讲,您可以将这些字节添加到仅包含QStrings 的数据流中,并将其反序列化为 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 不是某个幻数,它是字符串列表中的字符串数。那就是你的号码进入的地方。

于 2015-04-24T15:47:06.927 回答