org.proto
message Optimize {
required int element_size = 1;
required string element_name = 2;
}
message nodes {
repeated Optimize = 1;
}
具有此解码功能:
DecodeNodeMsg(char *msg, int size)
{
Org::nodes node;
int element_size;
string element_name;
int NumofElem = 0;
node.ParseFromArray((void *)msg, size);
for (int i = 0; i < nodes.Optimize().size(); i++)
{
element_size = nodes.Optimize(i).element_size();
element_name = nodes.Optimize(i).element_name();
cout << "size" << element_size << endl;
cout << "name" << element_name << endl;
NumofElem++;
}
cout << "number of" << NumofElem << endl;
}
我正在编码节点消息,其中包含三条Optimize消息。并调用此解码功能。编码部分是一个很久以来工作正常的旧代码。所以我不怀疑编码功能。
在解码功能中,我看到NumofElem被正确打印为三个。但是,我看到element_size&amp; element_name只是垃圾。整数有一些垃圾值,字符串有二进制数据。
我只有在这个重复的字段时才遇到这个问题。如果字段是必填/可选字段,那么我没有这个问题。
有人可能有类似的问题......?如果有任何关于如何解决这个问题的线索?
谢谢, 基兰
答案 0 :(得分:1)
我看不到你实际解码消息的位置。我看到你创建了一个新的节点对象,但随后调用了看起来错误的Org :: nodes()。我认为你需要像这样访问Optimize元素:
for (int i = 0; i < node->optimize_size(); i++)
{
element_size = node->optimize(i).element_size();
element_name = node->optimize(i).element_name();
cout << "size" << element_size << endl;
cout << "name" << element_name << endl;
NumofElem++;
}
但我认为你的节点对象需要从某些东西中解码。可变方法允许您设置数据。还有ParseFrom方法。同样在我的proto文件中,我对消息中的元素进行编号。见https://developers.google.com/protocol-buffers/docs/overview
message nodes {
repeated Optimize = 1;
}
答案 1 :(得分:1)
该函数将缓冲区反序列化为局部变量节点,但循环引用节点。我还要验证ParseFromArray的返回值。