首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在std::string和QByteArray之间无损转换的正确方法

在std::string和QByteArray之间无损转换的正确方法
EN

Stack Overflow用户
提问于 2012-05-27 00:00:22
回答 3查看 24.7K关注 0票数 28

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

我使用的是:

代码语言:javascript
复制
QByteArray qba = QString::fromStdString(stdString).toAscii();

代码语言:javascript
复制
QString(qba).toStdString();

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-27 00:09:12

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

QByteArraystd::string都有用于原始数据(C-字符串+长度)的构造函数,也有到C-字符串+长度的转换。因此,您可以使用它们进行转换:

代码语言:javascript
复制
// std::string => QByteArray
QByteArray byteArray(stdString.c_str(), stdString.length());

// QByteArray => std::string
std::string stdString(byteArray.constData(), byteArray.length());

它们都是二进制安全的,这意味着字符串可能包含'\0'字符,并且不会被截断。数据也不会被触及(没有UTF转换),所以这个转换是“无损的”。

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

票数 39
EN

Stack Overflow用户

发布于 2016-09-06 23:51:46

从Qt 5.4开始,QByteArray内置了对通过QByteArray::toStdString()QByteArray::fromStdString()进行std::string转换的支持。

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

代码语言:javascript
复制
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())); }
票数 18
EN

Stack Overflow用户

发布于 2013-10-17 07:58:01

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

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10767760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档