【问题标题】:QT QString from QDataStream来自 QDataStream 的 QT QString
【发布时间】: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) 后跟它的内容...

标签: qt


【解决方案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" 
    

    【讨论】: