vlong編碼規則

2021-07-03 07:12:40 字數 1394 閱讀 6295

byte bytes;位元組陣列,儲存資料長度,符號和值

start;讀取和寫入的起始位置

int len = bytes[start];這是起始位置的值,包含資料長度,符號,或者是值(當資料只有乙個位元組時)

len>=-112 代表vlong的值只有乙個位元組,即value = len;(-112-127);

len<-120 代表vlong的值是乙個負數,長度為-(len+120) ;(1-8位)

len在[-120,-112)範圍代表vlong的值是乙個正數,長度為-(len+112);(1-8位)

此部分**位於package org.apache.hadoop.io.writableutils類中;

readvlong源**:

int len = bytes[start];

if (len >= -112)

boolean isnegative = (len < -120);//判斷正負

len = isnegative ? -(len + 120) : -(len + 112);//獲取長度

if (start+1+len>bytes.length)//位元組陣列長度錯誤

throw

new ioexception("");

long i = 0;

for (int idx = 0; idx < len; idx++)

/**根據寫入long值限制,除去第一位符號位,因此i的最大有效位數是63位,

*最高位必然是0,因此i^-1l可以將i轉變為相對應的負數,此時表示式i^-1l相當於(i* -1)-1 ,

*至於-1的原因,我認為是因為負數比正數多乙個的原因,比如乙個位元組表示的數值範圍是-128~127,去除最高位,

*剩餘七位表示的最大數是127,127^ -1 正好可以表示-128 (個人理解,歡迎指正)

**/return (isnegative ? (i ^ -1l) : i);

writevlong源**

//stream是輸出流,i是要寫出的long值(8個位元組64位)

//第一位是符號位,剩餘63位代表其值

if (i >= -112 && i <= 127)

int len = -112;

if (i < 0)

long tmp = i;

//計算有效位元組數

while (tmp != 0)

stream.writebyte((byte)len);

len = (len < -120) ? -(len + 120) : -(len + 112);

//(1-8)

for (int idx = len; idx != 0; idx--)

C 編碼規則

c 編碼規則 一 命名 1.用pascal規則來命名方法和型別.public class textbox public void databind 2.用camel規則來命名區域性變數和方法的引數.string username public adduser string userid,byte p...

C 編碼規則

一 命名 1.用pascal規則來命名方法和型別.public class textbox public void databind 2.用camel規則來命名區域性變數和方法的引數.string username public adduser string userid,byte password...

POST編碼規則

這是乙個post資料編碼和解碼的函式 pragma warning disable 4786 include include include include using namespace std 編碼 const string post encode const string const iter...