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