上一篇介紹了protobuf-c的構(gòu)建。接下來(lái)介紹一下protobuf-c的使用。protobuf最核心的就是proto文件,其次通過(guò)protobuf-c編譯proto文件生成供c語(yǔ)言調(diào)用的庫(kù)文件和頭文件。下面逐一說(shuō)明一下proto文件的定義、protobuf-c編譯以及c語(yǔ)言如何使用protobuf。
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、云城網(wǎng)絡(luò)推廣、微信小程序定制開(kāi)發(fā)、云城網(wǎng)絡(luò)營(yíng)銷、云城企業(yè)策劃、云城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供云城建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cnprotobuf以消息Message為主要結(jié)構(gòu),消息中包含具體的字段,字段定義主要以required(必填字段)、optional(可選字段)、repeated(可重復(fù)字段)為主,包含了各大編程語(yǔ)言的基本數(shù)據(jù)類型、引用類型等。具體定義參考如下:
.proto文件:包含了Message結(jié)構(gòu)定義的協(xié)議文件,我們需要首先編寫.proto文件,然后再生成編程語(yǔ)言對(duì)應(yīng)的源文件。
Message結(jié)構(gòu):包含了字段的,每一條字段都包含定義聲明、數(shù)據(jù)類型以及字段序號(hào)。字段序號(hào)是唯一不重復(fù)的,序號(hào)保證了不同語(yǔ)言和平臺(tái)的序列化和反序列化字段的字節(jié)順序。
定義聲明:
required:聲明該字段是必填字段。
optional:聲明該字段是可選字段。
repeated:聲明該字段是可重復(fù)字段,通常用數(shù)組表示,也可以是list。
數(shù)據(jù)類型:protobuf支持的數(shù)據(jù)類型很全,可參考如下表:
.proto類型 | 描述 | pack | c/c++類型 |
---|---|---|---|
bool | 布爾類型 | pack(1) | bool |
double | 64位浮點(diǎn)類型 | pack(N) | double |
float | 32位浮點(diǎn)類型 | pack(N) | float |
int32 | 32位整數(shù)類型 | pack(N) | int |
int64 | 64位整數(shù)類型 | pack(N) | __int64 |
uint32 | 無(wú)符號(hào)32位整數(shù)類型 | pack(N) | unsigned int |
uint64 | 無(wú)符號(hào)64位整數(shù)類型 | pack(N) | unsigned __int64 |
sint32 | 32位整數(shù)類型,使用可變長(zhǎng)編碼方式。有符號(hào)的整型值。編碼時(shí)比通常的int32高效。 | pack(N) | int |
sint64 | 64位整數(shù)類型 ,使用可變長(zhǎng)編碼方式。有符號(hào)的整型值。編碼時(shí)比通常的int64高效。 | pack(1) | __int64 |
fixed32 | 32位無(wú)符號(hào)整數(shù)類型 ,總是4個(gè)字節(jié)。如果數(shù)值總是比總是比228大的話,這個(gè)類型會(huì)比uint32高效。 | pack(4) | bool |
fixed64 | 64位無(wú)符號(hào)整數(shù)類型,總是8個(gè)字節(jié)。如果數(shù)值總是比總是比256大的話,這個(gè)類型會(huì)比uint64高效。 | pack(8) | bool |
sfixed32 | 32位整數(shù)類型,總是4個(gè)字節(jié)。 | pack(4) | bool |
sfixed64 | 64位整數(shù)類型,總是8個(gè)字節(jié)。 | pack(8) | bool |
string | 字符串類型 | pack(N) | char*/char[]/std:string |
bytes | 一個(gè)字符串必須是UTF-8編碼或者7-bit ASCII編碼的文本。 | pack(N) | char*/char[]/std:string |
enum | 用戶自定義枚舉類型 | pack(N)與 uint32相同 | bool |
message | 用戶自定義的消息類型 | pack(N) | struct/class |
N 表示打包的字節(jié)并不是固定。而是根據(jù)數(shù)據(jù)的大小或者長(zhǎng)度打包。
編譯命令:
protoc-c --c_cout=. .proto文件 -lprotobuf-c
舉個(gè)栗子:
定義消息Message Command(命令),其中包含字段:
指令代碼:code 64位長(zhǎng)整類型,用于區(qū)分指令。
指令類型:type 32位整數(shù)類型,說(shuō)明該指令是查詢(0)、讀寫(1)、調(diào)用執(zhí)行(2)。
調(diào)用模塊名:module 字符串,調(diào)用哪個(gè)模塊的模塊名稱。
調(diào)用函數(shù)名:func 字符串,調(diào)用哪個(gè)模塊的函數(shù)名稱。
調(diào)用函數(shù)參數(shù):params 字符串?dāng)?shù)組,調(diào)用函數(shù)的參數(shù)。
.proto文件如下(Command.proto):
message Command{ required sint64 code = 1; //指令代碼 required sint32 type = 2; //指令類型 0 查詢 1 讀寫 2 調(diào)用執(zhí)行 required string module = 3; //調(diào)用模塊名 required string func = 4; //調(diào)用函數(shù)名 repeated string params = 5; //函數(shù)參數(shù)} message CommandResponse{ required sint32 code = 1; //返回代碼 0 成功 1 失敗 optional string msg = 2; //返回消息 失敗消息或成功消息 required sint32 version = 3; //接口版本 repeated Command data = 4; //真正的數(shù)據(jù)字段}1234567891011121314
執(zhí)行命令:
protoc-c --c_out=. Command.proto -lprotobuf-c
可以看到生成了Command.pb-c.c和Command.pb-c.h的c語(yǔ)言源文件和頭文件。
接下來(lái)嘗試調(diào)用上面生成的c文件。protobuf-c使用pack和unpack方法做序列化和反序列化操作。
在使用packed之前需要使用__INIT函數(shù)創(chuàng)建PB對(duì)象,然后為對(duì)象中字段逐一賦值。
CommandResponse response=COMMAND_RESPONSE__INIT;
這里需要注意response中包含的Command,也需要使用__INIT函數(shù)進(jìn)行初始化并賦值。
Command command=COMMAND__INIT;
在逐一賦值后,我們需要分配一個(gè)buffer用于保存序列化字節(jié),在對(duì)buffer分配空間時(shí),可以使用__get_packed_size函數(shù)獲取PB結(jié)構(gòu)體的大小作為分配空間的大小。
size_t size=command_response__get_packed_size(&response);
接下來(lái)使用__pack函數(shù)執(zhí)行序列化操作。
command_response__pack(&response,buf);
反序列化操作可直接使用__unpack函數(shù)。得到反序列化后的對(duì)象指針,通過(guò)指針可直接訪問(wèn)PB中的字段。
CommandResponse *response= command_response__unpack(NULL,size,buf);
在對(duì)PB訪問(wèn)完成后,需要通過(guò)__free_unpacked來(lái)釋放反序列化的內(nèi)存空間。
command_response__free_unpacked(response, NULL);
具體例子可參考protobuf-c的github wiki:https://github.com/protobuf-c/protobuf-c/wiki/Examples
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞名稱:protobuf-c的使用(二)使用-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://muchs.cn/article22/deipjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站、微信公眾號(hào)、標(biāo)簽優(yōu)化、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容