在 std::string 和 QByteArray 之间进行无损转换的正确方法是什么...主要是为了处理二进制数据?
我正在使用:
QByteArray qba = QString::fromStdString(stdString).toAscii();
和
QString(qba).toStdString();
但我想检查这是否真的正确。
对于二进制数据,您的解决方案是有问题的,因为非 ASCII 字符将被转换'?'
为QString::toAscii()
. 对于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
),因为大多数其他构造函数会在第一次出现零之前截断数据。
从 Qt 5.4QByteArray
开始,内置了对通过和进行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())); }
QByteArray 数据报;datagram.append(ui->lineEdit_sendData->text());