日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

protobuf入门教程(二):消息类型

發布時間:2024/4/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 protobuf入门教程(二):消息类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

操作流程

1)在.proto文件中定義消息格式?
2)使用protobuf編譯器生成C++類?
3)使用C++ API來讀寫消息

C++編程指導:https://developers.google.com/protocol-buffers/docs/cpptutorial

消息格式

syntax = "proto3"; //指定版本信息,不指定會報錯message Person //message為關鍵字,作用為定義一種消息類型 {string name = 1; //姓名int32 id = 2; //idstring email = 3; //郵件 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

消息由至少一個字段組合而成,類似于C語言中的結構體,每個字段都有一定的格式:

數據類型 字段名稱 = 唯一的編號標簽值;
  • 1
  • 1
  • 字段名稱:protobuf建議以下劃線命名而非駝峰式
  • 唯一的編號標簽代表每個字段的一個唯一的編號標簽,在同一個消息里不可以重復。這些編號標簽用與在消息二進制格式中標識你的字段,并且消息一旦定義就不能更改。需要說明的是標簽在1到15范圍的采用一個字節進行編碼,所以通常將標簽1到15用于頻繁發生的消息字段。編號標簽大小的范圍是1到229。此外不能使用protobuf系統預留的編號標簽(19000 ~19999)。

數據類型

.proto類型 C++類型 備注
double double 64位浮點數
float float 32位浮點數
int32 int32 32位整數
int64 int64 64位整數
uint32 uint32 32位無符號整數
uint64 uint64 64位無符號整數
sint32 int32 32位整數,處理負數效率比int32更高
sint32 sint64 64位整數,處理負數效率比int64更高
fixed32 uint32 總是4個字節。如果數值總是比總是比228大的話,這個類型會比uint32高效。
fixed64 uint64 總是8個字節。如果數值總是比總是比256大的話,這個類型會比uint64高效。
sfixed32 int32 總是4個字節
sfixed64 int64 總是8個字節
bool bool 布爾類型
string string 一個字符串必須是UTF-8編碼或者7-bit ASCII編碼的文本
bytes string 處理多字節的語言字符、如中文
enum enum 枚舉
message object of class 自定義的消息類型

更多詳情請看:https://developers.google.com/protocol-buffers/docs/encoding

proto文件

proto文件即消息協議原型定義文件,在該文件中我們可以通過使用描述性語言,來良好的定義我們程序中需要用到數據格式。

通過查看頭文件,可以發現針對每個字段都會大致生成如下幾種函數,以name為例:

void clear_name(); void set_name(const ::std::string& value); void set_name(const char* value); void set_name(const char* value, size_t size); const ::std::string& name() const; ::std::string* mutable_name();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可以看出,對于每個字段會生成一個clear清除函數(clear_name)、set函數(set_name)、get函數(name和mutable_name)。

這兒解釋下get函數中的兩個函數的區別: 對于原型為const std::string &number() const的get函數而言,返回的是常量字段,不能對其值進行修改。但是在有一些情況下,對字段進行修改是必要的,所以提供了一個mutable版的get函數,通過獲取字段變量的指針,從而達到改變其值的目的。

參考資料:http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html

總結

以上是生活随笔為你收集整理的protobuf入门教程(二):消息类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。