在計算機中,負數會被表示為很大的整數,因為計算機定義負數符號位為數字的最高位,所以如果採用varint編碼表示乙個負數,那麼一定需要5個位元位。所以在protobuf中通過sint32/sint64型別來表示負數,負數的處理形式是先採用zigzag編碼(把符號數轉化為無符號數),在採用
varint編碼。
sint32:(n << 1) ^ (n >> 31)
sint64:(n << 1) ^ (n >> 63)
比如儲存乙個(-300)的值
-300
原碼:0001 0010 1100
取反:1110 1101 0011
加1 :1110 1101 0100
n<<1: 整體左移一位,右邊補0 -> 1101 1010 1000
n>>31: 整體右移31位,左邊補1 -> 1111 1111 1111
n<<1 ^ n >>31
1101 1010 1000 ^ 1111 1111 1111 = 0010 0101 0111
十進位制: 0010 0101 0111 = 599
varint演算法: 從右往做,選取7位,高位補1/0(取決於位元組數)
得到兩個位元組
1101 0111 0000 0100
-41 、 4
protobuf序列化儲存
之前做的乙個專案,為了提速,用到了序列化儲存。下面是乙個protobuf的使用示例。include person.pb.h include iostream include fstream include time.h pragma comment lib,libprotobuf.lib pragm...
ProtoBuf 常用序列化 反序列化API
各位親 有時間可以去看看我的 金駿家居 店 買時說明在我的部落格看到有優惠哦 還有意外禮品贈送 真正的程式設計師 店 1 c陣列的序列化和反序列化api cpp view plain copy c陣列的序列化和序列化api bool parsefromarray const void data,in...
ProtoBuf 常用序列化 反序列化API
1 c陣列的序列化和反序列化api cpp view plain copy c陣列的序列化和序列化api bool parsefromarray const void data,intsize bool serializetoarray void data,intsize const 使用 void...