28

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

我正在使用:

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

QString(qba).toStdString();

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

4

3 回答 3

40

对于二进制数据,您的解决方案是有问题的,因为非 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 转换),所以这种转换是“无损的”。

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

于 2012-05-26T16:09:12.303 回答
18

从 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())); }
于 2016-09-06T15:51:46.180 回答
-5

QByteArray 数据报;datagram.append(ui->lineEdit_sendData->text());

于 2013-10-16T23:58:00.727 回答