来自QDataStream的QT QString

时间:2012-09-19 18:59:06

标签: qt

我正在使用缓冲区,我正在尝试从中获取一个字符串,但它不起作用......

示例:

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

字符串长度存储在2个第一个字节...

由于

2 个答案:

答案 0 :(得分: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的字节顺序。

答案 1 :(得分: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"