Protocol Buffer 四 整數序列化

來源:互聯網
上載者:User

varints用於正整數 (不帶正負號的整數)

varints 是 一個很不錯的技術。將一個整數序列化成1或者多個位元組。想起以前我們總是使用4位元組表示整數,真的很浪費啊。只有真正追求完美的人才會重視每個細節。

我的本篇介紹是https://developers.google.com/protocol-buffers/docs/encoding中的Base 128 Varints一節的逆過程。這麼好的網站被牆了,幸好我有VPN。

規則:

1.如果整數可以用一個位元組表示,不要改變它
2.否則,用上面的4步序列化
3.每個位元組最高位叫msb(most significant bit),1表示後面有位元組,0表示後面沒有位元組。

ZigZag用於負整數(有符號的整數)

但是這種varints encoding演算法用來處理負數是不合適的。因為它會把負數當作很大的正數,從而通常序列化成10位元組。顯然效率比較低。

遇到負數的時候,應該採用另一種encoding演算法。

如果是32位符號負整數,用

(n << 1) ^ (n >> 31)

64位符號負整數,用

(n << 1) ^ (n >> 61)

注意,這些移位都是arithmetic shift,也就是左移補0,右移補符號位。

注意,當protocol buffer編譯器看到你的類型是sint32或者sint64,它才會用ZigZag編碼。所以你要清楚你使用這兩個類型的意義。通常我只用來處理負整數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.