什么是在 std::string 和 QByteArray 之间无损转换的正确方法...主要是为了处理二进制数据?
我正在使用:
QByteArray qba = QString::fromStdString(stdString).toAscii();
和
QString(qba).toStdString();
但我想检查一下这是否真的正确。
最佳答案
对于二进制数据,您的解决方案是有问题的,因为非 ASCII 字符会被 QString::toAscii()
转换为 '?'
。对于 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
),因为大多数其他构造函数会在之前截断数据第一次出现零。
关于c++ - 无损转换 std::string 和 QByteArray 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767760/