2012-09-19 51 views
2

我有一个缓冲的工作和我试图从它那里得到一个字符串,但是,这不是工作...QT的QString从QDataStream

例子:

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

的字符串lenght存储2个第一字节...

感谢

+3

这对我来说很好。编写代码的代码是什么样的? – cgmb

+1

缓冲区存储了很多东西,当我尝试从中提取一个字符串时,位置没有跳到下一个操作码 –

+1

如何将字符串写入缓冲区? “字符串长度存储在2个第一个字节”是什么意思? (因为'QString'被存储和读取为一个32位的值,后跟实际的UTF16字符串)。 – alexisdm

回答

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位长度之前改变QDataStreamQDataStream::setByteOrder的字节序。

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"