2012-09-19 9 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 :< 
}* 

문자열 아이폰에 저장되어 2 첫 번째 바이트 ...

감사

+3

괜찮습니다. 글을 쓰는 코드는 어떻게 생겼습니까? – cgmb

+1

버퍼가 많은 것을 저장하고 있습니다. 문자열을 추출하려고 할 때 위치가 다음 opcode로 이동하지 않았습니다 –

+1

어떻게 버퍼를 처음 버퍼에 씁니까? "문자열 길이가 2 바이트에 저장됩니다"라는 의미는 무엇입니까? (왜냐하면'QString'은 32 비트 값과 실제 UTF16 문자열이 저장되고 읽혀지기 때문입니다). – alexisdm

답변

1

길이와 내용을 별도로

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::setByteOrderQDataStream의 엔디안을 변경해야 할 수도 있습니다.

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(); 
} 

출력을 실행되는 경우 문자열이 QString로 작성되지 않은 경우, 당신이 읽을 필요

$ ./App 
42 
"Qt"