3

私はバッファで作業しており、そこから文字列を取得しようとしていますが、機能していません...

例:

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

文字列の長さは最初の 2 バイトに格納されます...

ありがとう

4

2 に答える 2

2

文字列が として書かれていない場合は、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 ビット長を読み取る前に、 QDataStreamwith のエンディアンを変更する必要がある場合があります。QDataStream::setByteOrder

于 2012-09-19T21:35:26.150 に答える
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" 
于 2012-09-19T20:11:33.297 に答える