1

QVector<double>に変換したいのですがQBytearray、これを行う方法がわかりません。これを試しましたが、プログラムがクラッシュします:

QVector<double> vec;
QByteArray arr = QByteArray::fromRawData(reinterpret_cast<const char*>(vec),vec.size());
for(int i = 0; i< vec.size(); i++)
    arr.append(reinterpret_cast<const char*>(vec.data(&numberOfData),sizeof(double));

誰かがそれを正しく行う方法を教えてもらえますか?

4

4 に答える 4

12

QVector::constDataベクターに含まれる (const) 生データへのポインターを取得するために使用できます。ただし、サイズに単一のエントリのサイズを掛ける必要もありますsizeof(double)。コードのように後でループする必要はありません。

QByteArray data = QByteArray::fromRawData(
        reinterpret_cast<const char*>(vec.constData()),
        sizeof(double) * vec.size()
    );

を使用して変換を行うこともできますQDataStream。その結果、コードがよりクリーンになり、潜在的なバイト順序の問題も処理されます。

QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
for (auto x : vec)
    stream << x;
于 2014-11-10T12:18:04.970 に答える
1

QByteArray が一連の連続したバイトを受け取るように、ネイティブ配列を渡す必要があります。

double *bytes = new double[vec.size()];
for (int i = 0; i < vec.size(); ++i) {
   bytes[i] = vec[i];
}
QByteArray array = QByteArray::fromRawData(reinterpret_cast<void*>(bytes));
delete []bytes;

免責事項: テストされていないコード。

- - アップデート - -

leemes が正しく指摘したように、バイト配列を割り当ててコピーする必要はありません。QVector は生データへの 2 つのアクセス関数を既に提供しています。したがって、単純に data() と constData() を使用できます。彼の反応を見てください。

于 2014-11-10T12:07:16.270 に答える
0

今日、この変換はさらに簡単です。

QVector<double> vec;
// populate vector
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream << vec;
于 2016-04-28T22:02:21.713 に答える