2012-05-26 29 views
17

std :: stringとQByteArrayの間で無損失で変換する正しい方法は何ですか?主にバイナリデータを扱う目的でですか​​?std :: stringとQByteArrayとの無損失変換への正しい方法

私が使用しています:

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

QString(qba).toStdString(); 

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

答えて

25

バイナリデータの場合、非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変換はありません)ので、この変換は「ロスレス」です。

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

+0

ありがとうございました。 std :: stringの特定のコンストラクタは、必ずしもすべてのデータを取り込むわけではなく、最初のnullバイトで切り捨てられます。 –

+0

はい、この情報を追加していただきありがとうございます。回答に追加します。しかし、第2引数の長さを持つコンストラクタは切り詰められません。 – leemes

-3

QByteArray datagram; datagram.append(ui-> lineEdit_sendData-> text());

+1

あなたはどういうことを言っていますか? –

6

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())); } 
関連する問題