Std :: stringとQByteArrayの間で無損失に変換する正しい方法は何ですか?ほとんどバイナリデータを処理する目的のためですか?
私が使用しています:
QByteArray qba = QString::fromStdString(stdString).toAscii();
そして
QString(qba).toStdString();
しかし、これが実際に正しいかどうかを確認したいと思いました。
バイナリデータの場合、ASCII以外の文字はQString::toAscii()
によって'?'
に変換されるため、ソリューションに問題があります。 QString
の内部表現では、UTF-16変換の不要なオーバーヘッドもあります。ご想像のとおり、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番目の引数として長さを指定したコンストラクタを必ず使用してください(QByteArray
とstd::string
の両方)。
Qt 5.4以降、QByteArray
はQByteArray::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())); }