std :: stringとQByteArrayの間で無損失で変換する正しい方法は何ですか?主にバイナリデータを扱う目的でですか?std :: stringとQByteArrayとの無損失変換への正しい方法
私が使用しています:
QByteArray qba = QString::fromStdString(stdString).toAscii();
と
QString(qba).toStdString();
を私はこれが実際に正しいかどうかを確認したかったです。
std :: stringとQByteArrayの間で無損失で変換する正しい方法は何ですか?主にバイナリデータを扱う目的でですか?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変換はありません)ので、この変換は「ロスレス」です。
他のほとんどのコンストラクタがゼロの最初の出現の前にデータを切り捨てるので、(QByteArray
とstd::string
の両方の)第2引数として長さを持つコンストラクタを使用するようにしてください。
QByteArray datagram; datagram.append(ui-> lineEdit_sendData-> text());
あなたはどういうことを言っていますか? –
Qt 5.4以降、std::string
の変換はQByteArray::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())); }
ありがとうございました。 std :: stringの特定のコンストラクタは、必ずしもすべてのデータを取り込むわけではなく、最初のnullバイトで切り捨てられます。 –
はい、この情報を追加していただきありがとうございます。回答に追加します。しかし、第2引数の長さを持つコンストラクタは切り詰められません。 – leemes