Protobuf序列化的原理 負數的儲存

2021-10-14 05:51:01 字數 645 閱讀 1498

在計算機中,負數會被表示為很大的整數,因為計算機定義負數符號位為數字的最高位,所以如果採用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...