28

std::string と QByteArray の間でロスレスに変換する正しい方法は何ですか?主にバイナリデータを処理する目的で?

私は使用しています:

QByteArray qba = QString::fromStdString(stdString).toAscii();

QString(qba).toStdString();

しかし、これが実際に正しいかどうかを確認したかったのです。

4

3 に答える 3

40

バイナリ データの場合、ASCII 以外の文字は によって変換されるため、ソリューションには問題があり'?'ますQString::toAscii()。の内部表現のための UTF-16 変換の不要なオーバーヘッドもありQStringます。ご想像のとおりQString、データがバイナリではなくテキストの場合にのみ使用する必要があります。

との両方QByteArrayに、std::string生データ (C 文字列 + 長さ) のコンストラクタと、C 文字列 + 長さへの変換があります。したがって、それらを変換に使用できます。

// std::string => QByteArray
QByteArray byteArray(stdString.c_str(), stdString.length());

// QByteArray => std::string
std::string stdString(byteArray.constData(), byteArray.length());

どちらもバイナリ セーフです。つまり、文字列に文字が含まれる場合があり'\0'、切り捨てられません。データも変更されない (UTF 変換がない) ため、この変換は「ロスレス」です。

他のほとんどのコンストラクターは最初にゼロが出現する前にデータを切り捨てるので、長さを 2 番目の引数 ( と の両方) としてコンストラクターを使用するようにしてくださいQByteArraystd::string

于 2012-05-26T16:09:12.303 に答える
18

Qt 5.4 の時点で、およびを介した変換QByteArrayのサポートが組み込まれています。std::stringQByteArray::toStdString()QByteArray::fromStdString()

これらはleemes' answerとほぼ同じように実装されています。

inline std::string QByteArray::toStdString() const
{ return std::string(constData(), length()); }

inline QByteArray QByteArray::fromStdString(const std::string &s)
{ return QByteArray(s.data(), int(s.size())); }
于 2016-09-06T15:51:46.180 に答える