1. 程式人生 > >在prootbuf中, String和QByteArray互相轉換

在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());