定义消息以下源码示例来源于https://github.com/protobuf-c/protobuf-c/wiki/Examples
message AMessage {
required int32 a=1;
optional int32 b=2;
}
安装protobuf-c 我们需要把proto文件编译成c源码,才能在代码中使用,所以需要用到官方的编译工具
sudo apt-get install protobuf-c-compiler
编译
protoc-c --c_out=. amessage.proto
//将会产生amessage.pb-c.camessage.pb-c.h两个文件
代码中使用 序列化:
//serialize_main.c
#include
#include
#include "amessage.pb-c.h"int main (int argc, const char * argv[])
{
AMessage msg = AMESSAGE__INIT;
// AMessage
void *buf;
// Buffer to store serialized data
unsigned len;
// Length of serialized dataif (argc != 2 && argc != 3)
{// Allow one or two integers
fprintf(stderr,"usage: amessage a [b]\n");
return 1;
}msg.a = atoi(argv[1]);
if (argc == 3) { msg.has_b = 1;
msg.b = atoi(argv[2]);
}
len = amessage__get_packed_size(&msg);
buf = malloc(len);
amessage__pack(&msg,buf);
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 pipingfree(buf);
// Free the allocated serialized buffer
return 0;
}
【c|protocol buffers c语言的使用】反序列化:
//unserialize_main.c
#include
#include
#include "amessage.pb-c.h"
#define MAX_MSG_SIZE 1024static size_t
read_buffer (unsigned max_length, uint8_t *out)
{
size_t cur_len = 0;
size_t nread;
while ((nread=fread(out + cur_len, 1, max_length - cur_len, stdin)) != 0)
{
cur_len += nread;
if (cur_len == max_length)
{
fprintf(stderr, "max message length exceeded\n");
exit(1);
}
}
return cur_len;
}int main (int argc, const char * argv[])
{
AMessage *msg;
// Read packed message from standard-input.
uint8_t buf[MAX_MSG_SIZE];
size_t msg_len = read_buffer (MAX_MSG_SIZE, buf);
// Unpack the message using protobuf-c.
msg = amessage__unpack(NULL, msg_len, buf);
if (msg == NULL)
{
fprintf(stderr, "error unpacking incoming message\n");
exit(1);
}// display the message's fields.
printf("Received: a=%d",msg->a);
// required field
if (msg->has_b)// handle optional field
printf("b=%d",msg->b);
printf("\n");
// Free the unpacked message
amessage__free_unpacked(msg, NULL);
return 0;
}
编译可执行程序
gcc -o serialize_main serialize_main.c amessage.pb-c.c -lprotobuf-c
gcc -o unserialize_main unserialize_main.c amessage.pb-c.c -lprotobuf-c
运行
./serialize_main 10086 -123 | ./unserialize_main
推荐阅读
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 工具|Wireshark抓包对其字TCP段理解
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- 数据结构和算法|LeetCode 的正确使用方式
- C/C++|C/C++ basis 02
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开