正确无损地转换为std :: string和QByteArray的方法

时间:2012-05-26 16:00:22

标签: c++ string qt binary

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

我正在使用:

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

QString(qba).toStdString();

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

3 个答案:

答案 0 :(得分:31)

对于二进制数据,您的解决方案存在问题,因为非{ASCII}字符将由'?'转换为QString::toAscii()。对于QString的内部表示,还存在UTF-16转换的不必要开销。您可能已经猜到,QString只应在数据是文本而非二进制的情况下使用。

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

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

答案 1 :(得分:10)

自Qt 5.4起,Application.launch()已通过QByteArraystd::string内置支持QByteArray::toStdString()次转化。

这些实现与leemes' answer几乎相同。

QByteArray::fromStdString()

答案 2 :(得分:-5)

QByteArray数据报; datagram.append(UI-> lineEdit_sendData->文字());