protobuf-c 中repeated类型处理

github上的代码执行不过,修改之:

proto文件:【emessage.proto】

syntax="proto2";
message Submessage {
  required int32 value=1;
}
message EMessage {
  repeated Submessage a=1;
}

 

打包文件:【emessage_serialize.c】

#include <stdio.h>
#include <stdlib.h>
#include "emessage.pb-c.h"
int main (int argc, const char * argv[]) 
{
  Submessage **subs;
  void *buf;
  unsigned len,i;
  EMessage msg = EMESSAGE__INIT;
  subs = malloc (sizeof (Submessage*) * (argc-1));
  for (i = 1; i < argc; i++)
  {
    subs[i-1] = malloc (sizeof (Submessage));
    submessage__init (subs[i-1]);
    subs[i-1]->value = atoi(argv[i]);
  }    
  msg.n_a = argc-1;
  msg.a = subs;
  len = emessage__get_packed_size (&msg); // This is the calculated packing length
  buf = malloc (len);                     // Allocate memory
  emessage__pack (&msg, buf);             // Pack msg, including submessages
fprintf(stderr,"Writing %d serialized bytes\n",len); // See the length of message
  fwrite (buf, len, 1, stdout);           // Write to stdout to allow direct command line piping
    
  free(buf); // Free the allocated serialized buffer
  for (i = 1; i < argc; i++)
    free (subs[i]);
  free (subs); 
  return 0;
}

 

解包文件:【emessage_deserialize.c】

#include <stdio.h>
#include "emessage.pb-c.h"
#define MAX_MSG_SIZE 4096
int main (int argc, const char * argv[]) 
{
    EMessage *msg;
    char c; int i=0;
    uint8_t buf[MAX_MSG_SIZE]; // Input data container for bytes
    
    while (fread(&c,1,1,stdin) != 0)
    {
        if (i >= MAX_MSG_SIZE)
        {
            fprintf(stderr,"message too long for allocated buffer\n");
            return 1;
        }
        buf[i++] = c;
    }
    
    msg = emessage__unpack(NULL,i,buf); // Deserialize the serialized input
    if (msg == NULL)
    {
        fprintf(stderr,"error unpacking incoming message\n");
        return 1;
    }
    for (i = 0; i < msg->n_a; i++)
       printf ("%d\n", msg->a[i]->value);
    
    emessage__free_unpacked(msg,NULL);
    
    return 0;
}

 

执行:

./emessage_serialize 4 5 | ./emessage_deserialize

 

结果:

Writing: 8 serialized bytes
4
5

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Python的protobufrepeated字段表示重复的字段,也就是可以包含多个值的字段。在你提供的protobuf定义,我们可以看到repeated关键字被用于定义了repeated字段。 在Python使用protobuf处理repeated字段非常简单。首先,你需要通过parse_from_string方法将二进制数据解析为message对象。然后,你可以直接使用for循环遍历repeated字段的值。 例如,如果我们有一个AddressBook的message对象,其包含多个Person对象,我们可以使用如下代码来处理repeated字段: ``` import addressbook_pb2 address_book = addressbook_pb2.AddressBook() address_book.ParseFromString(data) # 解析二进制数据 for person in address_book.people: # 遍历repeated字段 print(person.name) # 打印每个Person对象的name字段的值 ``` 在这个例子,addressbook_pb2是根据你提供的protobuf定义生成的Python代码文件。我们首先创建一个AddressBook的对象address_book,然后通过ParseFromString方法将二进制数据解析为对象。然后,使用for循环遍历address_book.people,可以直接访问每个Person对象的属性,比如name字段。通过这种方式,我们可以处理repeated字段的数据。 提到了在protobuf编译出的.py文件没有生成API接口,只有DESCRIPTOR。这意味着我们不能像C或Java版本那样直接调用方法来访问repeated字段的元素。而是需要通过直接访问message对象的属性来获取repeated字段的值。 总结起来,Python的protobufrepeated字段表示重复的字段,可以包含多个值。我们可以使用for循环遍历repeated字段的值,通过访问message对象的属性来获取每个元素的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值