• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

                      四.結(jié)構(gòu)體(message)

            ProtobufMessage結(jié)構(gòu)是由一系列的key-value對組成的。其中,key由兩部分組成,成員序號field_numbervalue的類型wire_type,他們通過(field_number << 3) | wire_type的方式編碼為一個varintvalue根據(jù)wire_type而定;

                     Message結(jié)構(gòu)由.proto文件定義,這是協(xié)議雙方的接口文件,文件里面定義了每個結(jié)構(gòu)成員的序號即field_number,以及每個成員的類型(該類型會映射到wire_type),例如:

            message MSG_Login_Rsp

             {

                            required 1:uint32 rspcode = 100;//返回值,1為默認(rèn)值

                            required 2:string rspdesc = "success"; //success為默認(rèn)值

            }

                 其中,rspcode的序號為1,類型為uint32,默認(rèn)值為100rspdesc的序號為2,類型為string,默認(rèn)值為success

                 下面我們來看如何根據(jù)proto文件序列化結(jié)構(gòu)體(proto文件的規(guī)則后續(xù)的文章中會說明,這里只是原理性的描述)。

                 首先,需要做成員類型的劃分,如下:

                                             

            Type

            含義

            使用場景

            0

            Varint

            uint8,uint16,uint32

            2

            Length-delimited

            String ,bytesembedded messages,repeated fields

                    說明1)embedded message為結(jié)構(gòu)體的嵌套類型

                           2)repeated fields為某個可能重復(fù)的字段,重復(fù)次數(shù)可以為0

                               3Length-delimited的含義是“長度+值”,其中長度采用varint編碼,值為字符序列或者二進(jìn)制碼流

                               4Type的含義就是前文提到的wire_type

                        1)uint32為例,假若有如下proto接口

                                 message Test1

                                 {

                                        required 1: uint32 a = 150;

                                 }

                查看序列化的結(jié)果,可以得到16進(jìn)制:

            08 96 01

                由于uint32類型較為簡單,我們?nèi)菀椎贸觯?/span>key8,其中wire_type0field_number1value150

                         2)以string字符串為例,假若有如下proto接口

                                 message Test2

                                 {

                                        required 2: string msg = “testing”;

                                 }

                此時如果序列化,我們回得到下面16進(jìn)制碼流:

                                 12 07 74 65 73 74 69 6e 67

                剛才已經(jīng)提到message的編碼都是key-value對,OK,我們對號入座,由于key是一個varint,我們很容易斷定12就是key,將12轉(zhuǎn)化為二進(jìn)制格式:0001 0010,得出:wire_type2field_number2,說明接下來會出現(xiàn)Length-delimited類型,根據(jù)“長度+值”的規(guī)則,推斷出7string的長度,string為“testing”。

                        3)以結(jié)構(gòu)體的嵌套(embedded message)為例,假若有如下proto接口

                                 message  Test3

                                 {

                                        required 3: Test1;

                                 }

                看序列化碼流:

                                 1a 03 08 96 01

                參考上面string的情況,我們得到:key1a,其中wire_type2field_number3value的為 08 96 01,注意此時value本身是一個key-value對,這個對我們在1)中已經(jīng)做了解析。

                 

                  下一篇文章會描述proto接口文件的規(guī)則(主要基于libprotobuf的規(guī)則,但又有簡化)

             

               

            posted on 2009-09-11 19:35 true 閱讀(1840) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)服務(wù)器開發(fā)編碼知識通信技術(shù)
            久久久无码精品亚洲日韩蜜臀浪潮| 亚洲精品乱码久久久久久| 精品人妻伦九区久久AAA片69| 国产精品久久久久乳精品爆| 国产成年无码久久久久毛片| 久久久久久亚洲Av无码精品专口| 久久www免费人成看片| 亚洲av日韩精品久久久久久a| 狠狠色狠狠色综合久久| 99久久免费国产精品特黄| 亚洲国产成人精品无码久久久久久综合| 欧美777精品久久久久网| 国产激情久久久久影院| 国产精品久久久99| 亚洲国产成人精品无码久久久久久综合 | 中文字幕无码久久精品青草| 亚洲国产香蕉人人爽成AV片久久| 亚洲国产婷婷香蕉久久久久久| 伊人久久精品影院| 色婷婷综合久久久中文字幕| 国产亚洲婷婷香蕉久久精品| 狠狠人妻久久久久久综合蜜桃| 久久影视综合亚洲| 青青草原精品99久久精品66 | 亚洲国产成人乱码精品女人久久久不卡| 久久久久亚洲AV无码专区网站| 久久婷婷五月综合97色直播| 国产精品久久久久久影院| 91精品国产高清久久久久久91| 欧美久久一区二区三区| 亚洲国产精品18久久久久久| 久久精品这里热有精品| 欧美午夜精品久久久久久浪潮| 蜜臀av性久久久久蜜臀aⅴ| 97久久精品人人澡人人爽| 久久久久亚洲AV无码观看| 久久久久久久综合日本亚洲| 国产色综合久久无码有码| 欧美激情精品久久久久| 亚洲中文字幕无码久久2017 | 国产精品99久久久久久猫咪|