protobuf-c的学习总结

1、前言

         项目中用到protobuf-c进行数据序列化,好处在于后期程序扩展性非常好,只需要改动proto的定义就可以保持兼容,非常的灵活方便。关于protobuf-c的详细介绍可以参考google官方文档。https://code.google.com/p/protobuf-c/。在此简单的介绍一下基本功能。proto文件格式如下所示:

message AMessage
{
     requried  int32  a = 1;  //a必须出现
     optional  string b = 2;  //b是可选的
     repeated  int32  c = 3;  //c是数组
}

字段规则类型:

required:表示后面的数据是必须的。

optional:表示后面数据是可选的。

repeated:表示后面的数据是一个数组。

标量数值类型


.proto类型


Java 类型


C++类型


备注


double


double


double


 


float


float


float


 


int32


int


int32


使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。


int64


long


int64


使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。


uint32


int[1]


uint32


Uses variable-length encoding.


uint64

long[1] uint64 Uses variable-length encoding.

sint32


int


int32


使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。


sint64


long


int64


使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。


fixed32


int[1]


uint32


总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。


fixed64


long[1]


uint64


总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。


sfixed32


int


int32


总是4个字节。


sfixed64


long


int64


总是8个字节。


bool


boolean


bool


 


string


String


string


一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。


bytes


ByteString


string


可能包含任意顺序的字节数据。

2、测试程序

  编写一个学生信息的proto,proto文件内容如下所示:

  1 message Student
  2 {
  3     required string id = 1;
  4     required string name = 2;
  5     required string gender = 3;
  6     required int32  age = 4;
  7     required string object = 5;
  8     required string home_address = 6;
  9     required string phone = 7;
 10 }

编译命令: protoc-c --c_cout=.  student.proto

生成student.pb-c.c 和 student.pb-c.h两个文件。student.pb-c.h文件内容如下所示:

 1 /* Generated by the protocol buffer compiler.  DO NOT EDIT! */
 2
 3 #ifndef PROTOBUF_C_student_2eproto__INCLUDED
 4 #define PROTOBUF_C_student_2eproto__INCLUDED
 5
 6 #include <google/protobuf-c/protobuf-c.h>
 7
 8 PROTOBUF_C_BEGIN_DECLS
 9
10
11 typedef struct _Student Student;
12
13
14 /* --- enums --- */
15
16
17 /* --- messages --- */
18
19 struct  _Student
20 {
21   ProtobufCMessage base;
22   char *id;
23   char *name;
24   char *gender;
25   int32_t age;
26   char *object;
27   char *home_address;
28   char *phone;
29 };
30 #define STUDENT__INIT \
31  { PROTOBUF_C_MESSAGE_INIT (&student__descriptor) \
32     , NULL, NULL, NULL, 0, NULL, NULL, NULL }
33
34
35 /* Student methods */
36 void   student__init
37                      (Student         *message);
38 size_t student__get_packed_size
39                      (const Student   *message);
40 size_t student__pack
41                      (const Student   *message,
42                       uint8_t             *out);
43 size_t student__pack_to_buffer
44                      (const Student   *message,
45                       ProtobufCBuffer     *buffer);
46 Student *
47        student__unpack
48                      (ProtobufCAllocator  *allocator,
49                       size_t               len,
50                       const uint8_t       *data);
51 void   student__free_unpacked
52                      (Student *message,
53                       ProtobufCAllocator *allocator);
54 /* --- per-message closures --- */
55
56 typedef void (*Student_Closure)
57                  (const Student *message,
58                   void *closure_data);
59
60 /* --- services --- */
61
62
63 /* --- descriptors --- */
64
65 extern const ProtobufCMessageDescriptor student__descriptor;
66
67 PROTOBUF_C_END_DECLS
68
69
70 #endif  /* PROTOBUF_student_2eproto__INCLUDED */

测试proto程序如下所示:

  1 #include <stdio.h>
  2 #include <errno.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 #include "student.pb-c.h"
  6
  7 #define ID_LEN         11
  8 #define NAME_LEN       32
  9 #define GENDER_LEN     10
 10 #define OBJECT_LEN     20
 11 #define HOME_ADDR_LEN  96
 12 #define PHONE_LEN      12
 13
 14 static int malloc_student_info(Student *stu)
 15 {
 16     stu->id = (char*)malloc(ID_LEN);
 17     if (!stu->id)
 18     {
 19     goto FAILED;
 20     }
 21     stu->name = (char*)malloc(NAME_LEN);
 22     if (!stu->name)
 23     {
 24     goto FAILED;
 25     }
 26     stu->gender = (char*)malloc(GENDER_LEN);
 27     if (!stu->gender)
 28     {
 29     goto FAILED;
 30     }
 31     stu->object = (char*)malloc(OBJECT_LEN);
 32     if (!stu->object)
 33     {
 34     goto FAILED;
 35     }
 36     stu->home_address = (char*)malloc(HOME_ADDR_LEN);
 37     if (!stu->home_address)
 38     {
 39     goto FAILED;
 40     }
 41     stu->phone = (char*)malloc(PHONE_LEN);
 42     if (!stu->phone)
 43     {
 44     goto FAILED;
 45     }
 46     return 0;
 47 FAILED:
 48     fprintf(stdout, "malloc error.errno:%u,reason:%s\n",
 49         errno, strerror(errno));
 50     return -1;
 51 }
 52
 53 static void free_student_info(Student *stu)
 54 {
 55     if (stu->id)
 56     {
 57     free(stu->id);
 58     stu->id = NULL;
 59     }
 60     if (stu->name)
 61     {
 62     free(stu->name);
 63     stu->name = NULL;
 64     }
 65     if (stu->gender)
 66     {
 67     free(stu->gender);
 68     stu->gender = NULL;
 69     }
 70     if (stu->object)
 71     {
 72     free(stu->object);
 73     stu->object = NULL;
 74     }
 75     if (stu->home_address)
 76     {
 77     free(stu->home_address);
 78     stu->home_address = NULL;
 79     }
 80     if (stu->phone)
 81     {
 82     free(stu->phone);
 83     stu->phone = NULL;
 84     }
 85 }
 86
 87 static void set_student_info(Student *stu)
 88 {
 89     const char *id = "2013111011";
 90     const char *name = "Anker";
 91     const char *gender = "male";
 92     const char *object = "computer";
 93     const char *address = "shen zheng";
 94     const char *phone = "0102345678";
 95
 96     strncpy(stu->id, id, ID_LEN);
 97     strncpy(stu->name, name, NAME_LEN);
 98     strncpy(stu->gender, gender, GENDER_LEN);
 99     stu->age = 23;
100     strncpy(stu->object, object, OBJECT_LEN);
101     strncpy(stu->home_address, address, HOME_ADDR_LEN);
102     strncpy(stu->phone, phone, PHONE_LEN);
103 }
104
105 void print_student_info(Student *stu)
106 {
107     printf("id: %s\n",stu->id);
108     printf("name: %s\n",stu->name);
109     printf("age: %d\n",stu->age);
110     printf("gender:%s\n",stu->gender);
111     printf("object: %s\n",stu->object);
112     printf("home address: %s\n",stu->home_address);
113     printf("phone: %s\n",stu->phone);
114 }
115
116 int main()
117 {
118     Student stu = STUDENT__INIT;
119     void *buf = NULL;
120     unsigned int len ;
121     Student *msg = NULL;
122
123     if (malloc_student_info(&stu) == -1) {
124         exit(0);
125     }
126     set_student_info(&stu);
127
128     //get student packed size
129     len = student__get_packed_size(&stu);
130     printf("size of student info : %u\n",len);
131     buf = malloc(len);
132     //put student info pack to buf
133     student__pack(&stu, buf);
134
135     //unpack student info from buf
136     msg = student__unpack(NULL, len, buf);
137     print_student_info(msg);
138     //free msg
139     student__free_unpacked(msg, NULL);
140
141     free(buf);
142     free_student_info(&stu);
143
144     return 0;
145 }

编译命令: gcc student.pb-c.c main.c -o main -lprotobuf-c

测试结果如下所示:

时间: 2024-09-27 16:45:41

protobuf-c的学习总结的相关文章

如何利用Docker、AWS和深度学习伪装成一个艺术家

本文讲的是如何利用Docker.AWS和深度学习伪装成一个艺术家[编者的话]本篇文章描述了如何利用Docker.AWS和深度学习将一张普通的图片转换成艺术家的作品. "能工摹形,巧匠窃意(Good artists copy, great artists steal)" -- 毕加索 在英国第四频道纪录片系列之"Faking it"中,Paul O'Hare(一名来自利物浦的画家和室内装潢师)需要在四个星期的时间内,将自己伪装成一个艺术家,并且尝试着去欺骗伦敦美术馆的

谈一谈网络编程学习经验

建议大家去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf 1 谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice weibo.com/giantchen 2012-02-13 本文谈一谈我在学习网络编程方面的一些个人经验."网络编程"这个术语的范围很广,本文指用 Sockets API 开发基于

TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比

Google 近日发布了 TensorFlow 1.0 候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步.自 TensorFlow 于 2015 年底正式开源,距今已有一年多,这期间 TensorFlow 不断给人以惊喜.在这一年多时间,TensorFlow 已从初入深度学习框架大战的新星,成为了几近垄断的行业事实标准. 主流深度学习框架对比 深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括 TensorFlow.Caffe.Keras.CNTK.Torch7.MX

TensorFlow和Caffe、CNTK、MXNet等其他7种深度学习框架的对比

主流深度学习框架对比 深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow.Caffe8.Keras9.CNTK10.Torch711.MXNet12.Leaf13.Theano14.DeepLearning415.Lasagne16.Neon17,等等.然而TensorFlow却杀出重围,在关注度和用户数上都占据绝对优势,大有一统江湖之势.表2-1所示为各个开源框架在GitHub上的数据统计(数据统计于2017年1月3日),可以看到TensorFlow在st

深度学习框架Caffe源码解析

相信社区中很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制.本文将从整体架构和底层实现的视角,对Caffe源码进行解析. Caffe总体架构 Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示.Solver负责深度网络的训练,每个Solver中包含一个训练网络对象和一个测试网络对象.每个网络则由若干个Layer构成.每个Layer的输入和输出Feature map表示为I

解析:深度学习框架Caffe源码

雷锋网按:本文作者薛云峰,主要从事视频图像算法的研究,于浙江捷尚视觉科技股份有限公司担任深度学习算法研究员. 相信很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制.本文将从整体架构和底层实现的视角,对Caffe源码进行解析. 1.Caffe总体架构 Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示.Solver负责深度网络的训练,每个Solver中包含一个训练网络对象和

从这开始了解深度学习——视觉的深度学习与网络

已经很久没有更新内容了,今天抽空来给大家分享一些关于计算机视觉领域的一个重点,那就是 "深度学习",接下来就来详细聊聊深度学习(为什么要深度学习特征???),然后来说说深度网络的搭建,最后让我们自己用手 DIY 属于自己的网络,现在就开始 ing...... 介绍 一说起 "深度学习",大家有想过为什么要去搭建复杂网络,去学习更高级的特征呢?其实很简单,因为趋势是朝着类脑那个大方向,现在类脑工作已经得到很多研究员的关注. 类脑计算实际上存在两个技术层面:第 1 层面

大讲台浅谈什么是Hadoop及如何学习Hadoop

首先hadoop实现了一个分布式文件系统(HadoopDistributedFileSystem),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(highthroughput)来访问应用程序的数据,适合那些有着超大数据集(largedataset)的应用程序.HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streamingaccess)文件系统中的数据. Hadoop的框架最核心的设计就是:HDFS和MapRe

Protobuf 的 proto3 与 proto2 的区别

这是一篇学习笔记.在粗略的看了 Protobuf 的文档中关于 proto2 和 proto3 的说明后,记录下了几点 proto3 区别于 proto2 的地方. 总的来说,proto3 比 proto2 支持更多语言但 更简洁.去掉了一些复杂的语法和特性,更强调约定而弱化语法.如果是首次使用 Protobuf ,建议使用 proto3 . 在第一行非空白非注释行,必须写: syntax = "proto3"; 字段规则移除了 "required",并把 &quo

TensorFlow教程之进阶指南 3.3 TensorBoard:可视化学习

本文档为TensorFlow参考文档,本转载已得到TensorFlow中文社区授权. TensorBoard:可视化学习 TensorBoard 涉及到的运算,通常是在训练庞大的深度神经网络中出现的复杂而又难以理解的运算. 为了更方便 TensorFlow 程序的理解.调试与优化,我们发布了一套叫做 TensorBoard 的可视化工具.你可以用 TensorBoard 来展现你的 TensorFlow 图像,绘制图像生成的定量指标图以及附加数据. 当 TensorBoard 设置完成后,它应该