<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++ Protobuf

      Protobuf

      protobuf (protocol buffer) 是谷歌內部的混合語言數據標準。通過將結構化的數據進行序列化(串行化),用于通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。

      • 序列化: 將結構數據或者對象轉換成能夠用于存儲和傳輸的格式。

      • 反序列化: 在其他的計算環境中,將序列化后的數據還原為數據結構和對象

      下載安裝

      sudo apt install autoconf automake libtool curl make g++ unzip
      https://github.com/protocolbuffers/protobuf/releases/
      cd protobuf
      ./autogen.sh
      ./configure
      make
      make check
      sudo make install
      sudo ldconfig
      

      Proto3中的數據類型限定修飾符:

      repeated 表示一個數組類型
      

      protobuf中常用的數據類型:

      • bool, 布爾類型
      • double, 64位浮點數
      • float, 32位浮點數
      • int32, 32位整數
      • int64, 64位整數
      • uint64, 64位無符號整數
      • sint32, 32位整數,處理負數效率更高
      • sint64, 64位整數,處理負數效率更高
      • string, 只能處理ASCII字符
      • bytes, 用于處理多字節的語言字符
      • enum, 枚舉類型

      默認值

      解析消息時,如果編碼的消息不包含特定的單數元素,則已分析對象中的相應字段將設置為該字段的默認值。這些默認值是特定于類型的:

      • 對于字符串,默認值為空字符串。
      • 對于字節,默認值為空字節。
      • 對于布爾值,默認值為 false。
      • 對于數值類型,默認值為零。
      • 對于枚舉,默認值是第一個定義的枚舉值,該值必須為 0。
      • 對于消息字段,未設置該字段。它的確切值取決于語言。

      舉個栗子

      syntax = "proto3";	//默認proto2,這里用proto3
      
      package pt; //C++ 類似 namespace
      
      enum EnMsgType{
        EnMsgTypeP = 0; //占位
        LOGIN_MSG = 1;  // 登錄消息
        LOGIN_MSG_ACK = 2; // 登錄響應消息
        LOGIN_OUT_MSG = 3; // 注銷消息
        REG_MSG = 4; // 注冊消息
        REG_MSG_ACK = 5; // 注冊響應消息
        ONE_CHAT_MSG = 6; // 聊天消息
        ADD_FRIEND_MSG = 7; // 添加好友消息
        CREATE_GROUP_MSG = 8; // 創建群組
        ADD_GROUP_MSG = 9; // 加入群組
        GROUP_CHAT_MSG = 10; // 群聊天
      }
      
      message MsgType{
        EnMsgType msgtype = 1;
      }
      
      enum ErrCode {
        SUCCESS = 0; //正確
        FAILURE = 1; //失敗
        ONLINE = 2;  //已在線
      };
      
      message FriendsInfo {
        int32 id = 1;
        string name = 2;
        string state = 3;
      }
      
      message UsersInfo{
        int32 id = 1;
        string name = 2;
        string state = 3;
        string role = 4;
      }
      
      message GroupsInfo{
        int32 id = 1;
        string groupname = 2;
        string groupdesc = 3;
        repeated UsersInfo users = 4;
      }
      
      message Login {
        MsgType msgid = 1;
        int32 id = 2;
        string pwd = 3;
      }
      
      message LoginRsp{
        MsgType msgid = 1;
        int32 id = 2;
        string name = 3;
        repeated string offlinemsg = 4;
        repeated FriendsInfo friends = 5;
        repeated GroupsInfo groups = 6;
        ErrCode errcode = 7;
        string errmsg = 8;
      }
      

      生成代碼

       protoc test.proto --cpp_out=./
      
      #include <iostream>
      #include "test.pb.h"
      
      int main() {
          pt::Register reg;
          pt::MsgType* msg = reg.mutable_msgid();
          msg->set_msgtype(pt::EnMsgType::LOGIN_MSG);
      
          reg.set_name("cmf");
          reg.set_pwd("123456");
          std::string str;
          reg.SerializeToString(&str);	//序列化
          std::cout << str.c_str() << std::endl;
      
          pt::Register res;
          if (res.ParseFromString(str)) {	//反序列化
              std::cout << res.msgid().msgtype() << " " << res.name() << " " << res.pwd() << std::endl;
          }
      
          pt::LoginRsp loginRsp;
          pt::MsgType* m = loginRsp.mutable_msgid();
          m->set_msgtype(pt::EnMsgType::LOGIN_MSG_ACK);
      
          loginRsp.set_id(1);
          loginRsp.set_name("cmf");
          loginRsp.set_errcode(pt::ErrCode::SUCCESS);
          loginRsp.set_errmsg("test");
          loginRsp.add_offlinemsg("nihao");
      
          pt::FriendsInfo *info = loginRsp.add_friends();
          info->set_name("cc");
          info->set_id(2);
          info->set_state("no");
          std::string strr;
          loginRsp.SerializeToString(&strr);
          std::cout << strr << std::endl;
      
          for (int i = 0; i < loginRsp.friends_size(); ++i) {
              pt::FriendsInfo info = loginRsp.friends(i);
              std::cout << info.name() << " " << info.id() << " " << info.state() << std::endl;
          }
          return 0;
      }
      

      編譯運行加 -lprotobuf

      轉換接口

      #include <google/protobuf/util/json_util.h>
      
      using google::protobuf::util::JsonStringToMessage;
      
      bool proto_to_json(const google::protobuf::Message& message, std::string& json) {
          google::protobuf::util::JsonPrintOptions options;
          options.add_whitespace = true;
          options.always_print_primitive_fields = true;
          options.preserve_proto_field_names = true;
          return MessageToJsonString(message, &json, options).ok();
      }
      
      bool json_to_proto(const std::string& json, google::protobuf::Message& message) {
          return JsonStringToMessage(json, &message).ok();
      }
      
      posted @ 2022-08-27 22:27  放飛夢想C  閱讀(1604)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲日本va午夜中文字幕久久 | 少妇精品亚洲一区二区成人| 韩国无码AV片在线观看网站| 欧美日韩国产亚洲沙发| 免费十八禁一区二区三区| 日韩av不卡一区二区在线| 中文字幕久久久久人妻| 国产午夜福利精品视频| 东城区| 在线视频中文字幕二区| 在线观看免费人成视频色| 亚洲国产精品成人av网| 国产性色av高清在线观看| 十八禁国产精品一区二区| 国产精品三级中文字幕| 桓仁| 四虎网址| 丰满人妻跪趴高撅肥臀| 亚洲欧洲无码av电影在线观看| 最新亚洲人成网站在线观看 | 欧美寡妇xxxx黑人猛交| 亚日韩精品一区二区三区| 俺来也俺去啦最新在线| 四虎影院176| japan黑人极大黑炮| 国产精品久久无码一区| 小伙无套内射老熟女精品| 亚洲高清WWW色好看美女| 欧美一本大道香蕉综合视频| 国产成人精品亚洲午夜| 在线a亚洲老鸭窝天堂| 性xxxx视频播放免费| 久久熟女| 人人入人人爱| 国产人妻精品午夜福利免费| 台南县| 久久亚洲国产精品久久| 天天影视色香欲综合久久| 人妻少妇无码精品专区| 欧美精品人人做人人爱视频| 久久精产国品一二三产品|