protobufのC簡単なコード例(一)
3123 ワード
.
, , , 。 main.cpp, person.pb.h person.pb.cc , 。
[cpp] view plaincopy CODE
#include
#include "person.pb.h"
using namespace std;
using namespace tutorial;
int main()
{
Person person;
person.set_name("flamingo");
person.set_age(18);
cout<
言語マニュアルに基づいて簡単なファイルを作成します:amessage.proto、内容は以下の通りです
message AMessage { required int32 a=1; optional int32 b=2; }
tは、コマンドラインにより対応するものを生成する.h和.cソースファイル. # protoc-c --c_out=.amessage.proto
Cファイルは以下の通りです
#include#include#include"amessage.pb-c.h"int main (int argc,constchar* argv[]){ AMessage msg = AMESSAGE__INIT;//AMessage void*buf; //Buffer to storeserialized data unsigned len; //Length of serialized data if(argc !=2&& argc !=3) { //Allow one or twointegers fprintf(stderr,"usage:amessage a [b]"); return1; } 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 %dserialized bytes",len);//See the lengthof message fwrite(buf,len,1,stdout);//Write to stdoutto allow direct command line piping free(buf);//Free theallocated serialized buffer return0;}
次の点に注意してください.
A_の使用MESSAGE__INITマクロ作成情報のアーキテクチャパラメータbは、オプションのである
amessage__get_packed_sizeはパケットの長さを返します.
a_message__packはあなたが設計した情報をパッケージします.
次にamessageのパケットを解くコードを示します.
#include#include#include"amessage.pb-c.h"#define MAX_MSG_SIZE 1024static size_tread_buffer (unsigned max_length, uint8_t *out){ size_t cur_len =0; uint8_t c; while((nread=fread(out+ cur_len,1, max_length - cur_len,stdin))!=0) { cur_len += nread; if(cur_len == max_length) { fprintf(stderr,"max messagelength exceeded"); exit(1); } } return cur_len;}int main (int argc,constchar* 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,"errorunpacking incoming message"); exit(1); } //display the message's fields. printf("Received: a=%d",msg->a); //required field if(msg->has_b) //handle optionalfield printf(" b=%d",msg->b); printf(""); //Free the unpacked message amessage__free_unpacked(msg, NULL); return0;}
接続をコンパイルするときは'-lprotobuf-c'を含める必要があります.そうしないとコンパイルは通過しません.
Test by piping one program into the next atcommand line:
#./amessage_serialize 10 2 | ./amessage_deserialize------>パイプコマンドを使用するWriting:4 serialized bytesReceived:a=10 b=2