来自 QDataStream 的 QT QString
Posted
技术标签:
【中文标题】来自 QDataStream 的 QT QString【英文标题】:QT QString from QDataStream 【发布时间】:2012-09-19 18:59:06 【问题描述】:我正在使用一个缓冲区,我试图从中获取一个字符串,但没有工作......
例子:
*void myFunc(QDataStream& in)
quint8 v;
in >> v;
// Ok, I caught v value successfuly
QString s;
in >> s;
// Didnt work :<
*
字符串长度存储在前 2 个字节上...
谢谢
【问题讨论】:
我觉得还可以。写的代码是什么样的? 缓冲区存储了很多东西,当我尝试从中提取字符串时,位置没有跳转到下一个操作码 首先如何将字符串写入缓冲区? “字符串长度存储在前 2 个字节上”是什么意思? (因为QString
被存储和读取为 32 位值,后跟实际的 UTF16 字符串)。
我的意思是我正在尝试读取我不写的二进制文件,在这种情况下,字符串存储在 U16(lenght) 后跟它的内容...
【参考方案1】:
如果字符串不是写成QString
,则需要分别读取它的长度和内容。
quint8 v;
in >> v;
quint16 length = 0;
in >> length;
// the string is probably utf8 or latin
QByteArray buffer(length, Qt::Uninitialized);
in.readRawData(buffer.data(), length);
QString string(buffer);
在读取 16 位长度之前,您可能需要将 QDataStream
的字节顺序更改为 QDataStream::setByteOrder
。
【讨论】:
【参考方案2】:我们应该真正看到编写代码以及如何创建 QDataStream。我尝试了以下示例,在这种情况下,您的函数运行良好:
#include <QCoreApplication>
#include <QDebug>
#include <QDataStream>
#include <QBuffer>
void myFunc(QDataStream& in)
quint8 v;
in >> v;
qDebug() << v;
// Ok, I caught v value successfuly
QString s;
in >> s;
qDebug() << s;
// Didnt work :<
int main(int argc, char ** argv)
QCoreApplication a(argc, argv);
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
// write test data into the buffer
QDataStream out(&buffer);
quint8 ival = 42;
QString sval = "Qt";
out << ival;
out << sval;
// read back data
buffer.seek(0);
myFunc(out);
return a.exec();
执行时的输出:
$ ./App
42
"Qt"
【讨论】:
以上是关于来自 QDataStream 的 QT QString的主要内容,如果未能解决你的问题,请参考以下文章
Qt QSharedMemory 和 QDataStream
如何使用 QTextStream 而不是 QDataStream 从 QTableView 进行加载保存?
从QDataStream向QByteArray中写入数据时的注意点(QT)