在std :: string和QByteArray之间无损转换的正确方法是什么...主要是为了处理二进制数据?
我正在使用:
QByteArray qba = QString::fromStdString(stdString).toAscii();
和
QString(qba).toStdString();
但我想检查这是否真的正确。
答案 0 :(得分:31)
对于二进制数据,您的解决方案存在问题,因为非{ASCII}字符将由'?'
转换为QString::toAscii()
。对于QString
的内部表示,还存在UTF-16转换的不必要开销。您可能已经猜到,QString
只应在数据是文本而非二进制的情况下使用。
QByteArray
和std::string
都有原始数据的构造函数(C-string + length)以及C-string + length的转换。所以你可以用它们进行转换:
// 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
),因为大多数其他构造函数将在第一次出现零之前截断数据。
答案 1 :(得分:10)
自Qt 5.4起,Application.launch()
已通过QByteArray
和std::string
内置支持QByteArray::toStdString()
次转化。
这些实现与leemes' answer几乎相同。
QByteArray::fromStdString()
答案 2 :(得分:-5)
QByteArray数据报; datagram.append(UI-> lineEdit_sendData->文字());