What is the correct way to convert losslessly between std::string and QByteArray… mostly for the purpose of handling binary data?
I’m using:
QByteArray qba = QString::fromStdString(stdString).toAscii();
and
QString(qba).toStdString();
but I wanted to check whether this is actually correct.
For binary data your solution is problematic since non-ASCII characters would be converted to
'?'byQString::toAscii(). There is also the unnecessary overhead of UTF-16 conversion for the internal representation ofQString. As you might have guessed,QStringshould only be used if the data is textual, not binary.Both
QByteArrayandstd::stringhave constructors for raw data (C-string + length) and also a conversion to C-string + length. So you can use them for conversion:They are both binary-safe, meaning that the string may contain
'\0'characters and doesn’t get truncated. The data also doesn’t get touched (there is no UTF conversion), so this conversion is “lossless”.Make sure to use the constructors with the length as the second argument (for both
QByteArrayandstd::string), as most other constructors will truncate the data before the first occurrence of a zero.