在prootbuf中, String和QByteArray互相转换

在做项目中,应用到protobuf,通讯采用的是TCP,开发平台是Linux和Windows下的Qt5.11.2。由于Qt TCP传输数据类型是QByteArray,而protobuf需要将数据转换成string。

在正常使用过程中,QByteArray和string都可以采用以下方式进行转换。

string szWrite;
QByteArray baWrite = szWrite.c_str();
szWrite = baWrite .toStdString();

但这种方式存在一个问题,如果数据过程中,有\0,就会认为是数据的终止,所以baWrite得不到全部的数据。为了能够将数据全部获取,需要将数据转换成QString, 再转换成QByteArray。QByteArray转换成string则没有这个问题。

string szWrite;
QString qstWrite = QString::fromStdString(szWrite);
QByteArray baWrite = qstWrite.toUtf8() ;

为了计算数据是不是全部传输,可以计算数据的长度,

szWrite = "\010\002\016\010\003\020\001\032\010No Error";
int nLens = szWrite.length();

这个字符串的长度是18

后来在使用过程中发现,还会出现解析不正确的情况,后来改用SerializeToArray() 和 ParseFromArray()
序列化:

 QByteArray msgBytes = QByteArray(msg.ByteSize(),0);
 msg.SerializeToArray(msgBytes.data(), msg.ByteSize());
 m_pRemoteSocket->write(msgBytes.data());

反序列化:

QByteArray recvData = m_pRemoteSocket->readAll();
NET_MSG command; // 自己定义的protobuf类型
command.ParseFromArray(recvData.data(), recvData.size());

猜你喜欢

转载自blog.csdn.net/mafucun1988/article/details/83855771