青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

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

    一.問題的提出

    這里的編碼,具體是指如何高效地將基本類型序列化,以便在網絡上傳輸,不是指將整個數據包用utf8或base64等編碼,更不是應用層和業務相關的編碼。

    假若有定義如下:

              #pragma pack(1)

              typedef struct tagS_HDR

              {

                     uint8       nProtocol;//協議類型

                     uint16     nLength;//消息長度,不包括本消息頭

                     uint16     nType;//消息類型        

                     uint8       nExt;//協議擴展標記,比如消息子類型

              }S_HDR;

              #pragma pack()

              typedef struct tagS_FileTxHDR_Req

              {

                     S_HDR   hdr_;//消息頭

                     uint32            nUID_;//接收方用戶唯一ID

                     string             sFileName_;//要傳送的文件名

                     uint32            nFileSize_;//文件大小

                     uint8              nFileID_;//臨時分配的文件ID,最多支持同時傳256個文件

              }S_FileTxHDR_Req;

    如果你是做服務器開發,對類似這樣的結構體應該非常熟悉,為了簡化問題,在繼續討論之前,我們做幾個假設:

        (1)消息頭的長度是固定的,且設計足夠高效,不在編碼優化之列。

        (2)整形里面只關注uint8,uint16.uint32.

        (3)字符串關注兩類:以\0結尾的string和二進制流的bytes。

        (4)其它類型暫不關注,不影響問題的討論,后續會慢慢完善。

       (5)libprotobuf已經很強大,但也有限制,比如必須鏈接一個庫,如果是手機客戶端和服務器通訊,顯然是不能用的。

    場景如下:A(ID為123)要給B(ID為456)發送file.txt文件,文件內容為”Hello World!”,傳統的序列化方式為nUID占用4個字節,nFileSize也占用4個字節,而事實上456用2個字節表示足以,” Hello World!”的長度用一個字節表示足以。明顯是浪費嘛!有沒有什么辦法解決這個問題呢?當然有,答案是:站在巨人的肩上。

      

    二。Base 128 Varints

    Google Protobuf里面提出了“Base 128 Varints”編碼,這是一種變字節長度的編碼,官方描述為:varints是用一個或多個字節序列化整形的一種方法。我理解要點有三個(1)操作是序列化(2)操作對象是整形(3)變長編碼。重點是最后一點,他是如何編碼的呢?

       (1)除了最后一個字節,varint中的每個字節的最高位設為1,表示后面還有字節出現

       (2)每個字節的低7位看成是一個組(group),這個組和他相鄰的下一個7位組共同存儲某個整形的“組合表示”,最低有效組在前面。

    上面的定義可能比較生硬,我沒看具體例子之前,也沒搞明白,我們來看http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/encoding.html#varints中的例子:

        (1)一個字節。下面只有一個字節,所以最高位是0,表示十進制1

            0000 0001

        (2)兩個字節。

            1010 1100 0000 0010

        由于第一個字節后面還有一個字節,所以第一個字節的最高位設置為1,表示后面還有后繼字節,第二個字節的最高位為0。去掉每個字節的最高位,我們對兩個字節進行分組。第一個7位組:0101100,第二個7位組:0000010,組合起來就是:0101100 0000010,由于最低有效組在前面,所以兩個7位組進行調換,結果為:0000010  0101100,中間的空格是為了大家區分,去掉前面的0,也就是:100101100,十進制為1*2^8 + 1*2^5 + 1*2^3 + 1*2^2 = 256 + 32 + 8 + 4 = 300。

       (3)三個字節。我們換種方式,給定某個整形,要求寫出他的varint表示,這里當然是落在需要3個字節表示的整形。16380可以嗎?不可以!因為16380 < 2^14,所以2個字節足以,我們就以27491為例,27491的二進制表示為:

                     0110 1011 0110 0011

        注意這里是高字節之前,低字節在后,和varint的編碼規則相反,首先按照7位一組劃分為:0000001 1010110  1100011然后反轉為:1100011 1010110  0000001,最后將末尾的7位組前面補0組成一個字節,兩個7位組都補1分別組成一個字節:

                     11100011 11010110  00000001

       (4)更多字節。聰明的你可能發現,varint編碼中4個字節最大表示的數為2^28,非常正確,同時說明了天下沒有免費的午餐,有得有失。Protobuf引入了fixed32解決這個問題的,如果某個字段經常大于2^28,應當優選fixed32,他是固定長度為32位的。

     三.String和bytes

     string和bytes的表示形式一致,都是“長度+值”,其中長度采用varint編碼,值為字符序列或者二進制碼流

      

     如有錯誤,請指正,下次會寫到結構體類型的編碼,對應于libprotobuf的Message概念。

 

   


posted on 2009-09-11 04:12 true 閱讀(2779) 評論(5)  編輯 收藏 引用 所屬分類: 編碼知識通信技術

Feedback

# re: 協議設計之一 基本類型的編碼 2009-09-11 04:17 true
一篇文章竟然寫了一晚,該休息會了:)  回復  更多評論
  

# re: 協議設計之一 基本類型的編碼 2009-09-11 17:48 sd
省了微不足道的空間
卻在序列化上耗費時間
得不償失  回復  更多評論
  

# re: 協議設計之一 基本類型的編碼 2009-09-11 17:58 true
@sd
我也知道xmpp已經得到了廣泛的使用,這里主要是想,做一個自動描述協議,自動序列化的工具,既然要做到這樣,我選擇了基于libprotobuf的方案,第一次看到它的編碼時,著實讓人開闊思路:)  回復  更多評論
  

# re: 協議設計之一 基本類型的編碼 2009-09-12 10:28 guest
mfc系列化中的CString的長度字段采用了類似的變長方案:
len < 255, 1Byte(byte)
255<= len <65535, 3Byte( 0xff, ushort)
len >= 65535, 7byte(0xff, 0xff, 0xff, uint)
因為大部分的字符串長度小于255(1個字節就夠了), 使用3個字節都時候都很少了,需要使用7個字節的時候微乎其微。所以總體來說節省了空間,而且沒有復雜的解碼過程  回復  更多評論
  

# re: 協議設計之一 基本類型的編碼 2009-09-25 15:55 那誰
@sd
贊同你的觀點.
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99re热这里只有精品免费视频| 蜜桃av久久久亚洲精品| 美女国产精品| 夜夜嗨av色一区二区不卡| 久久精品卡一| 国产精品每日更新| 在线免费观看欧美| 欧美一区二区在线| 亚洲伦理中文字幕| 葵司免费一区二区三区四区五区| 国产精品成人一区二区| 亚洲精品日韩在线观看| 久久婷婷影院| 一区二区三区四区五区精品| 你懂的成人av| 狠狠做深爱婷婷久久综合一区 | 亚洲欧美精品一区| 亚洲福利av| 久久久久久久欧美精品| 国产欧美亚洲视频| 亚洲视频综合在线| 亚洲激情社区| 老鸭窝亚洲一区二区三区| 黄色一区二区三区| 久久亚洲精品欧美| 久久精品免费观看| 国语自产精品视频在线看抢先版结局 | 国产欧美一区二区三区久久| 亚洲欧美在线一区| 欧美顶级大胆免费视频| 亚洲国产另类久久久精品极度| 麻豆9191精品国产| 久久综合99re88久久爱| 在线日韩av永久免费观看| 美国十次成人| 欧美va亚洲va国产综合| 亚洲毛片在线观看| 亚洲精品国产品国语在线app| 欧美激情综合色综合啪啪| 99精品欧美一区二区蜜桃免费| 亚洲肉体裸体xxxx137| 欧美精品一区二区蜜臀亚洲| 亚洲最快最全在线视频| 99视频精品全部免费在线| 国产精品久99| 久久精品国产亚洲一区二区| 久久xxxx精品视频| 在线成人中文字幕| 亚洲国产日韩一区| 欧美日韩国产限制| 亚洲亚洲精品在线观看 | 欧美日韩在线免费| 亚洲尤物视频网| 午夜精品短视频| 精品动漫av| 亚洲高清在线观看一区| 欧美日韩一区二区视频在线观看| 亚洲欧美第一页| 午夜精品久久99蜜桃的功能介绍| 国产视频观看一区| 欧美v日韩v国产v| 欧美激情va永久在线播放| 亚洲一区二区三区四区视频| 亚洲综合欧美日韩| 伊人久久噜噜噜躁狠狠躁 | 久久福利一区| 亚洲第一精品夜夜躁人人爽| 亚洲激情影院| 国产精品色午夜在线观看| 久久综合九色综合欧美狠狠| 欧美jizzhd精品欧美巨大免费| 一区二区三区欧美亚洲| 亚洲女优在线| 亚洲国产精品日韩| 一本综合久久| 国产一区在线看| 亚洲国产视频一区| 国产精品一国产精品k频道56| 狂野欧美一区| 亚洲一区在线观看免费观看电影高清 | 亚洲欧美日本国产专区一区| 国内成人精品2018免费看| 亚洲激情欧美| 欧美一区三区二区在线观看| 亚洲大胆女人| 亚洲精品中文字幕在线观看| 国产精品一二三视频| 欧美黑人多人双交| 欧美午夜视频一区二区| 久久久久久噜噜噜久久久精品| 欧美视频一区在线观看| 亚洲国产另类久久久精品极度| 国产日韩精品视频一区二区三区| 亚洲精品午夜| 亚洲精品国久久99热| 久久精品国产精品| 久久精品视频免费| 国产精品一区二区三区久久久 | 日韩西西人体444www| 久久精品久久综合| 久久精品视频播放| 国产欧美综合在线| 亚洲午夜一级| 亚洲欧美区自拍先锋| 欧美日韩精品国产| 亚洲韩国日本中文字幕| 亚洲国产欧洲综合997久久| 久久久久99精品国产片| 久久久女女女女999久久| 国产欧美欧美| 午夜一区不卡| 欧美在线播放高清精品| 国产精品亚洲美女av网站| 亚洲深夜福利| 亚洲一区二区动漫| 欧美性感一类影片在线播放| 亚洲免费观看在线观看| 一区二区三区四区精品| 欧美日韩高清在线观看| 亚洲九九爱视频| 一本色道久久99精品综合 | 韩日欧美一区二区三区| 欧美一区二区播放| 久久成人综合网| 国产自产高清不卡| 久久精品日产第一区二区三区 | 国产精品午夜视频| 红桃视频欧美| 欧美成人影音| 亚洲激情第一页| 欧美黄污视频| 亚洲精品乱码久久久久久按摩观| 亚洲精品激情| 欧美激情视频一区二区三区不卡| 亚洲激情视频在线播放| 一本色道久久综合亚洲精品小说 | 欧美国产一区二区在线观看| 亚洲国产精品久久久久秋霞影院| 麻豆久久婷婷| 亚洲欧洲日产国产网站| 国产精品99久久久久久人| 国产精品国产三级国产普通话99 | 国产亚洲制服色| 久久国产色av| 亚洲电影在线看| 在线视频欧美日韩精品| 国产精品国产三级国产aⅴ无密码| 亚洲欧美乱综合| 久久在线观看视频| 亚洲精品乱码久久久久| 欧美日韩国产在线播放| 亚洲一区二区三区在线视频| 久久精品国产99| 亚洲电影自拍| 欧美日韩成人激情| 宅男精品导航| 久久综合狠狠综合久久综合88| 亚洲国产专区| 欧美午夜激情在线| 久久国产精品99国产| 欧美国产日韩一二三区| 亚洲私拍自拍| 国产一区二区三区免费在线观看| 久久人91精品久久久久久不卡| 欧美二区视频| 亚洲一区二区免费| 好看的亚洲午夜视频在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 一区二区在线免费观看| 老色批av在线精品| 99视频在线观看一区三区| 久久国产乱子精品免费女 | 欧美专区中文字幕| 亚洲国产成人精品久久| 亚洲综合精品四区| 激情欧美国产欧美| 欧美日韩国产精品成人| 欧美一区二区久久久| 最新热久久免费视频| 欧美一区精品| 亚洲经典视频在线观看| 国产精品福利在线观看网址| 久久久久久久久久码影片| 亚洲精品一区二区三区蜜桃久| 久久爱www久久做| 亚洲精品久久久久中文字幕欢迎你 | 亚洲精品综合精品自拍| 国产精品久久久久久久久动漫| 亚久久调教视频| 亚洲青涩在线| 久久久久久久网| 亚洲乱码精品一二三四区日韩在线| 国产精品一区二区在线观看网站| 欧美成人午夜影院| 亚洲欧美电影院| 亚洲精品三级| 免费成人av在线| 欧美在线免费观看视频| 99re热这里只有精品视频| 经典三级久久|