2012-09-19 52 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"