在std::string和QByteArray之间进行无损转换的正确方法是什么?主要是为了处理二进制数据?
我使用的是:
QByteArray qba = QString::fromStdString(stdString).toAscii();
和
QString(qba).toStdString();
但我想检查一下这是否真的正确。
发布于 2012-05-27 00:09:12
对于二进制数据,您的解决方案是有问题的,因为QString::toAscii()
会将非ASCII字符转换为'?'
。对于QString
的内部表示,还存在不必要的UTF-16转换开销。正如您可能已经猜到的那样,只有当数据是文本数据而不是二进制数据时,才应该使用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
),因为大多数其他构造函数将在第一次出现零之前截断数据。
发布于 2016-09-06 23:51:46
从Qt 5.4开始,QByteArray
内置了对通过QByteArray::toStdString()
和QByteArray::fromStdString()
进行std::string
转换的支持。
这些实现几乎与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())); }
发布于 2013-10-17 07:58:01
datagram.append(ui->lineEdit_sendData->text());;QByteArray数据报
https://stackoverflow.com/questions/10767760
复制相似问题