从QDataStream创建QT QString

3

我正在使用缓冲区并尝试从中获取字符串,但是没有成功...

示例:

*void myFunc(QDataStream& in)
{
    quint8 v;
    in >> v;
    // Ok, I caught v value successfuly
    QString s;
    in >> s;
    // Didnt work :<
}*

字符串长度存储在前两个字节中...
谢谢。

3
那看起来对我来说还不错。能让我看一下写这篇文章的代码吗? - cgmb
1
缓冲区存储了很多东西,当我尝试从中提取一个字符串时,位置没有跳转到下一个操作码。 - Kraup Kywpz
1
你怎么首先将字符串写入缓冲区?你所说的“字符串长度存储在前两个字节中”是什么意思?(因为 QString 存储和读取时作为 32 位值,后面跟着实际的 UTF16 字符串)。 - alexisdm
2
我的意思是我正在尝试读取一个我没有编写的二进制文件,在这种情况下,字符串存储为U16(长度)后跟其内容... - Kraup Kywpz
2个回答

2
如果字符串不是以 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::setByteOrder 更改 QDataStream 的字节顺序。


0
我们应该真正看到编写代码以及您如何创建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" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接