Protobufの理解について

4692 ワード

文書ディレクトリ

  • Protobufについての理解
  • Protobuf
  • とは
  • Protoの使用
  • protoファイル作成の基本ルール
  • 符号化構造
  • Varints
  • Zigzag
  • Message structure
  • Repeated
  • Map

  • Protobufの理解について


    Protobufとは


    公式文書の説明:
    protocol buffersは、言語に関係なく、プラットフォームに関係なく、拡張可能なシーケンス化構造データの方法であり、通信プロトコル、データストレージなどに使用することができる.Protocol Buffersは、柔軟で効率的で自動化されたメカニズムの構造データシーケンス化方法であり、XMLよりも分類可能であるが、XMLよりも小さく(3~10倍)、より速く(20~100倍)、より簡単である.データの構造を定義し、特殊に生成されたソースコードを使用して、さまざまなデータストリームでさまざまな言語を使用して構造データの作成と読み取りを簡単に行うことができます.古いデータ構造でコンパイルされたデプロイメントされたプログラムを破壊することなく、データ構造を更新することもできます.
    まとめ:言語に関係なく、プラットフォームに関係なく、効率的で、互換性が良い

    Protoの使用


    protoファイル作成の基本ルール


    データ構造の定義
    // xxx.proto define xxx message
    message xxx{
        required string val_1 = 1 
        // required ->  1 
        optional string val_2 = 2
        // optional ->  0 1 
        repeated string val_3 = 3
        // repeated ->  
        message EmbeddMessage{
        	int32 int32val = 1
        	string stringVal = 2
        }
        optional EmbeddMessage example = 4
    }
    

    インタフェースコード生成
    # $SRC_DIR .proto  
    # --cpp_out   c++  
    # $DST_DIR  
    protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
    

    コーディングこうぞう


    Varints


    各バイトは7ビットで数字を表し、最上位は後にデータがあるかどうかを表す.後ろから前へ符号化するので圧縮アルゴリズムでもあり、小さいデジタル圧縮ほど効果的です
    ex1. var num int32 ; num=10、numのバイナリは:00000000 00000000 00000000 00001010 Varints符号化後:00001010ex2. var num int32 ; num=300,numのバイナリ:00000000 00000000 00000001 00101100 Varints符号化後:10101100 00000010

    Zigzag


    符号ビットを最後にずらし、残りの31ビットを1つずつ前にし、負数であれば符号ビット以外のすべてのビットを逆にします.符号化目的:できるだけバイナリの中の1を減らして、データ圧縮コードの実現を便利にする:
    int int2zigzag(int n){
    	return (n<<1)^(n>>31);
    }
    int zigzag2int(int n){
    	return  (((unsignedint)n) >> 1) ^ -(n & 1)
    }
    

    Message structure


    Repeated


    Map