成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談數值壓縮存儲方法Varint

開發 開發工具
我們經常在網絡通訊的時候,需要把一些數據存儲到byte[]中然后再發送出去,數值則是我們經常處理的數據成員。發越少的東西意味著使用更少的IO和帶寬。

在編寫網絡通訊的時候我們經常需要把一些數據存儲到byte[]中然后再發送出去,數值則是我們經常處理的數據成員。發越少的東西意味著使用更少的IO和帶寬 ,所以對傳輸數據進行壓縮也是件非常重要的事情。接下來提到的就是一種基于數字存儲的方式在大多數情況下可以節省數值存儲空間。

Varint 是一種緊湊的表示數字的方法。它用一個或多個字節來表示一個數字,值越小的數字使用越少的字節數。這能減少用來表示數字的字節數。比如對于 int32 類型的數字,一般需要 4 個 byte 來表示。但是采用 Varint,對于很小的 int32 類型的數字,則可以用 1 個 byte 來表示。當然凡事都有好的也有不好的一面,采用 Varint 表示法,大的數字則需要 5 個 byte 來表示。從統計的角度來說,一般不會所有的消息中的數字都是大數,因此大多數情況下,采用 Varint 后,可以用更少的字節數來表示數字信息。下面就詳細介紹一下 Varint。

Varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位為 1,表示后續的 byte 也是該數字的一部分,如果該位為 0,則結束。其他的 7 個 bit 都用來表示數字。因此小于 128 的數字都可以用一個 byte 表示。大于 128 的數字,比如 300,會用兩個字節來表示:1010 1100 0000 0010

由于負數的高位為1,所以采用這種壓縮處理的時候必須負數轉成正數,可以通過以下代碼實現int to uint的轉換

  1. private static int Zag(uint ziggedValue)   
  2. {   
  3. int value = (int)ziggedValue;   
  4. return (-(value & 0x01)) ^ ((value >> 1) & ~( 1<< 31));   
  5. }   
  6. private static uint Zig(int value)   
  7. {   
  8. return (uint)((value << 1) ^ (value >> 31));    

以下操作是對一個uint進行編碼處理

  1. private static ArraySegment<byte> WriteUInt32Variant(uint value)   
  2. {   
  3. byte[] data = new byte[5];   
  4. int count = 0;   
  5. do 
  6. {   
  7. data[count] = (byte)((value & 0x7F) | 0x80);   
  8. count++;   
  9. while ((value >>= 7) != 0);   
  10. data[count - 1] &= 0x7F;   
  11. return new ArraySegment<byte>(data, 0, count);   

data[count] = (byte)((value & 0x7F) | 0x80); 得到頭7位的數值, | 0x80是表明后面的byte也是數字的一部分。

while ((value >>= 7) != 0) 右移7位如果不為零的情況下則繼續上面的工作。

data[count - 1] &= 0x7F 把最后byte的最高位設置成0;

接下來就是一個uint的解碼過程

  1. private static uint ReadUInt32Variant(ArraySegment<byte> data)   
  2. {   
  3. uint value = data.Array[0];   
  4. if ((value & 0x80) == 0) return value;   
  5. value &= 0x7F;   
  6. uint chunk = data.Array[1];   
  7. value |= (chunk & 0x7F) << 7;   
  8. if ((chunk & 0x80) == 0) return value;   
  9. chunk = data.Array[2];   
  10. value |= (chunk & 0x7F) << 14;   
  11. if ((chunk & 0x80) == 0) return value;   
  12. chunk = data.Array[3];   
  13. value |= (chunk & 0x7F) << 21;   
  14. if ((chunk & 0x80) == 0) return value;   
  15. chunk = data.Array[4]; ;   
  16. value |= chunk << 28;   
  17. if ((chunk & 0xF0) == 0) return value;   
  18. throw new OverflowException("ReadUInt32Variant Error!");   

(value & 0x80) == 0 表示最高位為0,說明后面的byte已經不是數值組成部分。

(chunk & 0xF0) == 0 chunk只有4位,如果不是則表明這個byte不是數值存儲的一部分。

測試一下看下編碼效果

  1. ArraySegment<byte> data = WriteUInt32Variant(Zig(0));   
  2. Console.WriteLine(data.Count);   
  3. data = WriteUInt32Variant(Zig(567));   
  4. Console.WriteLine(data.Count);   
  5. data = WriteUInt32Variant(Zig(10000));   
  6. Console.WriteLine(data.Count);   
  7. data = WriteUInt32Variant(Zig(-100000));   
  8. Console.WriteLine(data.Count); 

分別是1byte,2byte,3byte,3byte

其實有人會有凝問,為什么不根據情況來用int16等來存儲,如果一旦用了int16就說明以后需要轉int32就是件非常麻煩的事情,雙方程序都需要調整。如果采用Varint進行處理就能達到最好擴展效果和帶寬利用率.

原文鏈接:http://www.cnblogs.com/smark/archive/2012/05/03/2480034.html

【編輯推薦】

  1. 詳解Java類的生命周期
  2. Java代碼編寫的30條建議
  3. Java Excel API及詳細教程
  4. Java集合框架和數組的排序
  5. 淺談Java中static作用

 

責任編輯:彭凡 來源: 博客園
相關推薦

2012-04-16 15:08:33

2020-07-30 07:30:17

存儲技術數據

2015-06-17 09:34:09

軟件定義存儲 云存儲

2023-05-15 15:44:02

JavaScript數值存儲

2017-08-03 17:30:51

IBM存儲IBM存儲

2023-01-05 11:27:27

技術架構

2015-09-15 17:51:42

存儲系統云存儲存儲開發

2011-06-17 17:37:16

JavaSQL Server

2022-08-14 07:14:50

Kafka零拷貝

2016-01-28 18:25:25

戴爾云計算

2012-06-26 14:21:50

JavaScript

2024-07-02 11:30:00

存儲壓縮算法

2009-11-18 13:38:27

2022-09-04 18:00:11

ArrayListVector

2009-09-14 15:50:17

CCNA學習方法

2021-03-04 20:33:09

補碼小數符號位

2018-08-27 10:54:30

C++壓縮存儲

2009-09-05 10:26:20

Linux壓縮打包命令Linux命令

2009-12-16 16:11:14

Linux壓縮文件

2009-10-20 15:39:20

Linux壓縮
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久成人免费视频 | 日本中文字幕一区 | 正在播放一区二区 | 久久久久久久久99 | 亚洲国产成人精品女人久久久 | 一区二区三区四区在线视频 | 日韩网站在线观看 | 精品久久久久久久久久久久久久 | 中文字幕在线中文 | 欧美精品一区二区三区在线播放 | 丝袜美腿一区二区三区 | 国产成人精品一区二 | 99久久99| 超碰日本 | 亚洲精彩视频 | 国产午夜精品视频 | 一级做a| 欧美mv日韩mv国产网站91进入 | 亚洲综合视频 | 久久99精品久久久久久 | 波多野结衣一区二区三区在线观看 | www狠狠爱com | 亚洲免费成人 | 欧美八区| 免费在线毛片 | 91原创视频| 久久99精品久久久久久秒播九色 | 日本在线视频中文字幕 | 中文字幕人成人 | 超碰地址 | 在线视频a | 国产91网址 | 成人毛片一区二区三区 | 日韩一区不卡 | 亚洲人在线观看视频 | 亚洲最大的成人网 | 国产精品国产精品国产专区不卡 | 欧美性影院 | 在线成人 | 久久久免费毛片 | 浮生影院免费观看中文版 |