【问题标题】:Issue in reading repeated fields from protocol buffers in C++从 C++ 中的协议缓冲区读取重复字段的问题
【发布时间】:2013-11-26 20:30:44
【问题描述】:

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;
}

我正在对包含三个优化消息的节点消息进行编码。并调用此解码函数。编码部分是一个旧代码,长期运行良好。所以我不怀疑编码功能。

在解码函数中,我看到 NumofElem 正确打印为三个。但是,我看到 element_size 和 element_name 都只是垃圾。整数有一些垃圾值,字符串有一个二进制数据。

仅当此重复字段时,我才会遇到此问题。如果字段是必填/可选字段,那么我没有这个问题。

有人有类似的问题吗...?如果是这样,有什么关于如何解决这个问题的线索吗?

谢谢, 基兰

【问题讨论】:

  • 您能否提供实际编译并演示该错误的代码?您现在拥有的代码无法编译——至少,.proto 语法无效,而且我对 C++ 有疑问。

标签: c++ protocol-buffers


【解决方案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 方法。同样在我的原型文件中,我对消息中的元素进行编号。见https://developers.google.com/protocol-buffers/docs/overview

 message nodes {
   repeated Optimize = 1;
 }

【讨论】:

  • 你提到的所有三个都是在问题中输入错误。我有一个 ParsingFromArray 函数,节点是一个局部变量,所以 nodes.optimize() 很好,而且我还有消息中每个字段的数字。已相应地更新了问题。很抱歉给您带来不便
【解决方案2】:

该函数将缓冲区反序列化为局部变量node,但循环引用了nodes。我还会验证 ParseFromArray 的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-12
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多