gpt4 book ai didi

c++ - 从 QDataStream 轻松读出到 QStringList

转载 作者:行者123 更新时间:2023-11-30 02:39:24 25 4
gpt4 key购买 nike

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

QStringList traceNames;

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

streamQDataStream .

我在想类似 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

虽然这是否符合“简单”的条件还有待商榷...还要注意 3 不是某个魔数(Magic Number),它是字符串列表中的字符串数。这就是您的电话号码所在的位置。

关于c++ - 从 QDataStream 轻松读出到 QStringList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com