1. ホーム
  2. c++

[解決済み] Qt 5.3でQByteArrayを文字列に変換するにはどうすればよいですか?

2022-02-16 21:11:14

質問

いくつかの関数を使って変換しています。 QVector's まで QByteArray's を、例えば。

QByteArray Serialize::serialize(QVector<double> data)
{
    QByteArray byteArray;
    QDataStream out(&byteArray, QIODevice::WriteOnly);
    out << data;
    return byteArray;
}

void Serialize::deserialize(QByteArray byteArray, QVector<double> *data)
{
    QDataStream in(&byteArray, QIODevice::ReadOnly);
    in >> *data;
}

今、私が持っているのは QByteArray テキストファイルに入れたいのですが、どのように変換すればいいのでしょうか? QString ?

一番簡単な方法はもう試しました。

QString myString(data); // data - QByteArray

しかし myString は常に空です。

も発見しました。 toStdString() という関数がドキュメントで紹介されていますが、これは Qt 5.4 .

を使っています。 Qt 5.3 .

完全な例に従います。

#include <QCoreApplication>

#include <QDebug>
#include <QVector>
#include <QByteArray>
#include <QDataStream>

QByteArray serialize(QVector<double> data)
{
    QByteArray byteArray;
    QDataStream out(&byteArray, QIODevice::WriteOnly);
    out << data;
    return byteArray;
}

void deserialize(QByteArray byteArray, QVector<double> *data)
{
    QDataStream in(&byteArray, QIODevice::ReadOnly);
    in >> *data;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QVector<double> data;
    data << 1.1 << 2.2 << 3.3 << 4.4 << 5.5 << 6.6 << 7.7 << 8.8 << 9.9;

    QByteArray byteArray = serialize(data);
    QVector<double> dataConverted;
    deserialize(byteArray, &dataConverted);

    qDebug() << "Data:";
    qDebug() << data;
    qDebug() << "ByteArray:";
    QString test(byteArray);
    qDebug() << test;
    qDebug() << "Data Converted:";
    qDebug() << dataConverted;

    return a.exec();
}

備考 : を生成することが一般的な目的です。 SQL のすべての内容を含むファイルです。 SQLite データベースを使用しています。私のダブルベクターが変換され QByteArray として保存され BLOB を(serialize 関数を使って)データベースに入れています。データベースから読み込む必要があるときは、deserialize 関数を使って再び double vector に変換しています。ここで、私は SQL ファイル内のデータを BLOB という形式を使えば、他のデータベースに直接インポートすることができますね。

どのように解決するのですか?

問題は、バイト配列は型にとらわれないデータ型であり、単にメモリ上の個々のバイトの集まりを表していることです。このサンプルコードでは、バイト配列をdoubleのベクトルから作成し、別のdoubleのベクトルに変換しています。問題ありません。

しかし、QStringのコンストラクタにバイト配列を渡すと、QStringはバイト配列を文字列を表すデータ、例えばASCII文字コードの配列として解釈しようとします。

文字列クラスによってはこれを許してしまい、ゴミだらけのインスタンスを作ってしまうかもしれませんが、QStringは基本的なエラーチェックを行い、空の文字列を与えて助けてくれているように見えます。

倍数のバイト配列の内容を出力するコードとしては、あなたが提供したdeserializeメソッドは悪くない例です。