Подтвердить что ты не робот

Правильный способ без потерь конвертировать в и из std::string и QByteArray

Каков правильный способ преобразования без потерь между std::string и QByteArray... главным образом для обработки двоичных данных?

Я использую:

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

и

QString(qba).toStdString();

но я хотел проверить, действительно ли это правильно.

4b9b3361

Ответ 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), так как большинство других конструкторов будут обрезать данные до первого появления нуля.

Ответ 2

Как и в Qt 5.4, QByteArray построил поддержку преобразований std::string через QByteArray::toStdString() и QByteArray::fromStdString().

Они реализованы почти идентично ответу leemes.

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())); }

Ответ 3

QByteArray датаграмма; datagram.append(ui- > lineEdit_sendData- > текст());