Protobufデータ符号化規則

2560 ワード

  • ProtoBuf符号化の基礎:--Varints,varintsは1つの整数を1つ以上のBytesにシーケンス化する方法であり、小さい整数ほど使用されるBytesは少ない.Varintsの基本ルールは:
  • 各Byteの最上位(msb)はフラグビットであり、ビットが1である場合、そのByteの後ろに他のByteがあることを示し、ビットが0である場合、そのByteが最後のByteであることを示す.
  • 各Byteの下位7ビットは、数値を格納するためのビット
  • である.
  • Varints法Litte-Endian(小端)バイト順
  • 例:300がVarintsでシーケンス化する結果は1010,1100,000,000,0010であり、演算過程は以下の通りである:
  • .
    1010 1100 0000 0010->010 1100 000 0010(デフラグビット)->000 0010 010 1100(バイト順調整)->1 0010 1100->256+32+8+4=300(計算値)
  • ProtoBufはmessageをkey-valueの組合せ(c)keyと見なす2つの部分からなり、一部はメッセージを定義する際のフィールドの番号(field_num)、もう一部はフィールドタイプ(wire_type)である.フィールドタイプ定義は次の表のとおりです.
    Type
    Meaning
    Used For
    0
    Varint
    int32, int64, uint32, uint64, sint32, sint64, bool, enum
    1
    64-bit
    fixed64, sfixed64, double
    2
    Length-delimited
    string, bytes, embedded messages, packed repeated fields
    3
    Start group
    groups (deprecated)
    4
    End group
    groups (deprecated)
    5
    32-bit
    fixed32, sfixed32, float
    (d)keyの符号化方式:field_num << 3 | wire_type(e)varintタイプ(wire_type=0)の符号化は、(1)セクションで紹介した方法とほぼ一致するが、int 32,int 64,sint 32,sint 64には、int 32とint 64がvarints法で単純に符号化されるため、-1,-2のように負の数も比較的多いBytesを占める点が特別である.そこでsint 32およびsint 64は、Zigzag法を用いてすべての整数(正、0および負)をすべての符号なし数に1つずつマッピングした後、varints符号化法を用いて符号化する改良された方法を採用した.Zigzagマッピング関数は,Zigzag(n)=(n<<1)^(n>31),nがsint 32の場合Zigzag(n)=(n<<1)^(n>63),nがsint 64の場合は下表が比較的直感的なマッピングテーブルであり,マッピング後に符号化を行う利点は,絶対値が比較的小さい負数シーケンス化の結果が占めるBytes数も比較的少ないことである.
    Signed Original
    Encoded As
    0
    0
    -1
    1
    1
    2
    -2
    3
    2
    4
    -3
    5


    2147483647
    4294967294
    -2147483648
    4294967295
    (f)64-bit(wire_type=1)と32-bit(wire_type=5)の符号化方式は比較的簡単で、keyの後ろに直接64 bitsまたは32 bitsに追いつき、Little-Endian(小端)バイト順を採用する.(g)length-delimited(wire_type=2)の符号化方式:key+length+content、keyの符号化方式は統一されており、lengthはvarints符号化方式を採用し、contentはlengthで指定された長さのBytesである.(h)wire_type=3と4の現在では推奨されていないので、ここでは紹介しません.3)ProtoBuf符号化におけるフィールド順序(Field order)の問題:(a)符号化/復号化はフィールド順序に関係なく、key-valueメカニズムによって(b)未知のフィールドに対して、符号化時にシーケンス化された既知のフィールドの後ろに書くことが保証される.
  • 符号化は3つのセグメントに分けられる:
  • 12 07 74 65 73 74 69 6e 67

    The red bytes are the UTF8 of "testing". The key here is 0x12 → tag = 2, type = 2. The length varint in the value is 7 and lo and behold, we find seven bytes following it – our string.
    転載する
    http://blog.csdn.net/gstormspire/article/details/8315150