Ответ 1
Для двоичных данных ваше решение проблематично, поскольку символы, отличные от ASCII, будут преобразованы в '?'
на QString::toAscii()
. Существует также ненужные служебные данные преобразования UTF-16 для внутреннего представления QString
. Как вы могли догадаться, 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
), так как большинство других конструкторов будут обрезать данные до первого появления нуля.