protobuf-c 中重复的子消息

问题描述 投票:0回答:4

有人可以给我一个在 protobuf-c 中使用重复子消息打包\解包消息的示例吗?

关于此事的官方文档。

c linux serialization protocol-buffers
4个回答
2
投票
message B {
  required int64 i = 1;
};

message A {
  repeated B numbers = 1;
};

A a;
a.ParseFromString(<str>)
for (int i = 0; i < a.numbers_size(); ++i) {
  const B& b = a.numbers(i);
  printf("%d\n", b.i());
}

1
投票

原型:

message SubMsg {
  bytes value = 1;
}

message MainMsg {
  repeated SubMsg msgs = 1;
}

打包(不要忘记释放内存(free(...)):

MainMsg mainMsg = { };
main_msg__init(&mainMsg);
SubMsg **subMsgs = calloc(LEN, sizeof(SubMsg*));
for (int i = 0; i < LEN; i++) {
    subMsgs[i] = calloc(1, sizeof(SubMsg));
    sub_msg__init(subMsgs[i]);
    subMsgs[i]->value.data = DATA;
    subMsgs[i]->value.len = DATALEN;
}
mainMsg.msgs = subMsgs;
mainMsg.n_msgs = LEN;
...
main_msg__pack(&mainMsg, BUFFER);

解压(不要忘记释放内存(..._free_unpacked(...)):

MainMsg* mainMsg = main_msg__unpack(nullptr, BUFFERLEN, BUFFER);
if (! mainMsg) {
    // error
    return;
}

SubMsg **subMsgs = mainMsg->msgs;
...

1
投票

原型:

message A {
  optional uint32 key = 1;
  optional uint64 value = 2;
}

message B {
  repeated A msg = 1;
}

如果有可选的XXX字段,尝试将has_XXX设置为true;

  B msg;  
  heartbeat_content__init(&msg);
  A **subs = (A**)malloc(N * sizeof(A*));
  void *buf;                      
  unsigned len,i;                 
  for (int i = 0; i < N; ++i) {
    subs[i] = (A*)malloc(sizeof(A));
    job_status__init(subs[i]);
    subs[i]->key = i + 1;
    subs[i]->has_key = 1;
    subs[i]->value = (i + 1) * 100;
    subs[i]->has_value = 1;
  }
  msg.msg = subs;
  msg.n_msg = N;
  len =  heartbeat_content__get_packed_size(&msg);  
  buf = malloc(len);
  heartbeat_content__pack(&msg, (uint8_t *)buf);    

-3
投票

Google C++ 教程的“阅读消息”部分有相关示例代码: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

此外,STL 的 for_each 似乎也可以正常工作(或多或少是语法糖): std::for_each(a.numbers().begin() ,a.numbers().end() ,[](const B& b) { std::cout << b.i() << std::endl ; } ) ;

© www.soinside.com 2019 - 2024. All rights reserved.