Protobufデータ符号化規則
2560 ワード
1010 1100 0000 0010->010 1100 000 0010(デフラグビット)->000 0010 010 1100(バイト順調整)->1 0010 1100->256+32+8+4=300(計算値)
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)未知のフィールドに対して、符号化時にシーケンス化された既知のフィールドの後ろに書くことが保証される.
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