在prootbuf中, String和QByteArray互相轉換
阿新 • • 發佈:2018-11-15
在做專案中,應用到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());