web-dev-qa-db-ja.com

std :: stringおよびQ​​ByteArrayとの間でロスレス変換を行う正しい方法

Std :: stringとQByteArrayの間で無損失に変換する正しい方法は何ですか?ほとんどバイナリデータを処理する目的のためですか?

私が使用しています:

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

そして

QString(qba).toStdString();

しかし、これが実際に正しいかどうかを確認したいと思いました。

24
Jake Petroules

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

QByteArraystd::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の両方)。

33
leemes

Qt 5.4以降、QByteArrayQByteArray::toStdString()およびQByteArray::fromStdString()を介したstd::string変換の組み込みサポートを備えています。

これらは 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())); }
13
Parker Coates