Protobuf:序列化/反序列化c++到Js



我使用protobuf从Cpp发送/接收二进制数据到Js,反之亦然,我使用QWebChannel与HTML客户端通信。

问题:如何对cpp中由Js序列化发送的二进制数据进行反序列化?

下面我试了:

//Serialization: Cpp to JS - WORKING
tutorial::PhoneNumber* ph = new tutorial::PhoneNumber();
ph->set_number("555-515-135");
ph->set_type(500);
QByteArray  bytes = QByteArray::fromStdString(ph->SerializeAsString());
QString args = """ + bytes.toBase64(QByteArray::Base64Encoding) + """;
QString JsFunctionCall = QString("DeserializePhoneNumber(%1);").arg(args);
m_pWebView->page()->runJavaScript(JsFunctionCall);

//Deserialization In JS - Js Code - WORKING
var obj = phone_msg.PhoneNumber.deserializeBinary(data);
console.log("PhoneNumber: " + obj.getNumber());
console.log("Type: " + obj.getType());

//Serialization in Js - WORKING
var phNum = new phone_msg.PhoneNumber;
phNum.setNumber("555-515-135");
phNum.setId(500);
var base64Str = btoa(phNum.serializeBinary());
console.log("base64Str: " + base64Str);
//Call Cpp function from Js
MainChannel.SendMsgToCpp(base64Str);

Cpp的反序列化- NOT WORKING

bool WebRelay::ReceiveMsgFromJs(QVariant data)
{
QString str = data.toString();
QByteArray bytedata = str.toLatin1(); 
QByteArray base64data = QByteArray::fromBase64(bytedata); 
std::string stdstr = base64data.toStdString();

tutorial::PhoneNumber cppPhNum;
//THIS IS NOT WORKING. Text and id are invalid
cppPhNum.ParseFromArray(base64data.constData(), base64data.size());
qDebug() << "Text:" << itemData.number();
qDebug() << "id:" << cppPhNum.id();
}

找到问题。我从Js中得到逗号分隔的字节,如:10、7、74115、73116101109,今年49岁,16日45

我用','分割字符串并创建了一个QByteArray

QStringList strList = str.split(',');
QByteArray bytedata;
foreach(const QString & str, strList)
{
bytedata+= (str.toUInt());
}
std::string stdstr = bytedata.toStdString();
itemData.ParseFromString(stdstr);

同样在JS中,我删除了二进制字符串到base64的转换:

var base64Str = phNum.serializeBinary();

最新更新