c++ - 无损转换 std::string 和 QByteArray 的正确方法

标签 c++ string qt binary

什么是在 std::string 和 QByteArray 之间无损转换的正确方法...主要是为了处理二进制数据?

我正在使用:

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

QString(qba).toStdString();

但我想检查一下这是否真的正确。

最佳答案

对于二进制数据,您的解决方案是有问题的,因为非 ASCII 字符会被 QString::toAscii() 转换为 '?'。对于 QString 的内部表示,还有不必要的 UTF-16 转换开销。正如您可能已经猜到的那样,QString 仅应在数据是文本而非二进制数据时使用。

QByteArraystd::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 转换),所以这种转换是“无损”的。

确保使用长度作为第二个参数的构造函数(对于 QByteArraystd::string),因为大多数其他构造函数会在之前截断数据第一次出现零。

关于c++ - 无损转换 std::string 和 QByteArray 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767760/

相关文章:

c++ - boost::spirit 算术公式解析器编译失败

javascript - 不理解解决重复字符串 JavaScript 的特定方法的一部分

java - 如何将泛型类型转换为String

regex - 使用正则表达式匹配自定义字符串

c++ - 如何使用 Qt 网络类防止关机竞争条件

c++ - 与 GLSL 相关的 OpenGL 应用程序代码

c++ - 通过实时按键停止循环

c++ - Qt - 如何将 QString 转换为 char(不是 char*)

javascript - 将 Node.js net.socket 与流式消息协议(protocol)一起使用

ios - Qt XCode iOS 入口点