中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

varint是什么意思

發布時間:2021-12-09 15:28:27 來源:億速云 閱讀:240 作者:柒染 欄目:大數據

這篇文章給大家介紹varint是什么意思,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

作為熟悉Kafka的讀者,肯定知道Kafka的消息中的很多長度字段均采用了可變長度的編碼格式,那么這種可變的編碼格式是什么呢,沒錯,就是我們今天要講的varint編碼格式。

字節序

計算機在信息傳輸的過程中都是采用一定的編碼格式將數據編碼為二進制,當數據接收方收到數據以后也會進行相應的解碼將二進制數據轉換成響應的格式。在計算機中,一個二進制數字(0或1)代表1Bit,8個Bit又稱為1個字節(byte)。

字節序指的就是多個字節在通信中的排列順序,字節序目前有兩種格式:

  • 大端序:整數的最高字節在存儲時在最低字節的前面則稱為大端序,通俗一點說就是按照數字的書寫順序進行二進制的轉換
  • 小端序:整數的最低字節在存儲時在最高字節的前面則稱為小端序,通俗一點說就是按照數字書寫的顛倒順序進行二進制的轉換

下圖就是數字123456的斷續和小端序的二進制格式:

varint是什么意思  


首先int類型的數據占據4個字節,以大端序為例我們可以看到123456的高位的第一個字節都是無用的,我們可以使用三個字節就能代表123456,由于Kafka的長度字段的數值都會遠遠小于123456,甚至1個字節也可以表示,如果我們依舊使用int來表示長度的話將會浪費大量的空間,因此基于這個原因,Kafka在自己的v2消息格式中的長度字段具采用了可變長度的表示,這種表示方式就是通過varint編碼。

 
varint

varint其實并不僅僅在kafka中有所使用,大名鼎鼎的Protocol Buffers也使用varint編碼。

varint是使用一個或多個字節序列化整數的方式,他可以把一個固定字節的整數編碼成變長字節。

varint編碼中每一個字節的最高位都不用來存儲數字的真正表示,而是表示當前字節是否還屬于當前數據,1代表是,0代表不是(也就是該字節是當前數據的最后一個字節數據)。每一個字節的低7位用于以7位為一組存儲數字的二進制補碼表示,最低有效數組在前,這也就表明varint編碼是按照小端序來排列的。

圖中對數字123456進行varint編碼,123456用二進制表示為1 11100010 01000000,每次低從向高取7位再加上最高有效位變成11000000 11000100 00000111。

varint是什么意思  


下面我們通過一段Java代碼實現varint編碼和解碼,其中只實現了無符號Interger類型的數據。

public class VarInt {
   public static void writeUnsignedVarint(int value, DataOutput output) throws IOException {        // value & 0xffffff80 當前字節是否為最后一個字節,不是則執行while        while ((value & 0xffffff80) != 0) {            // value & 0x7f保證可以取到整數最低7位            // | 0x80 填充字節最高位為1,因為當前字節還不是數據的最后一個字節            byte b = (byte) ((value & 0x7f) | 0x80);            output.writeByte(b);            System.out.println(b);            value >>>= 7 ;        }        // 寫入最后一個字節        System.out.println(value);        output.writeByte(value);    }
   public static int readUnsignedVarint(ByteBuffer buffer) {        int value = 0;        int b;        int i = 0;        while (((b = buffer.get()) & 0x80) != 0) {            value |= (b & 0x7f) << i;            i += 7;            if (i >= 28) {                throw new IllegalArgumentException("illegal varint");            }        }        value |= b << i;        return value;    }
   public static void main(String[] args) throws IOException {        DataOutputStream output = new DataOutputStream(new ByteArrayOutputStream(2));        writeUnsignedVarint(123456, output);        System.out.println("encode size:" + output.size());        System.out.println("-----------");        byte[] bytes = new byte[]{-64, -60, 7};        ByteBuffer wrap = ByteBuffer.wrap(bytes);        System.out.println("decode:" + readUnsignedVarint(wrap));        System.out.println("-----------");    }}
關于varint是什么意思就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥棱县| 阜新| 南陵县| 昌黎县| 淅川县| 泽库县| 永泰县| 万源市| 阜新| 达日县| 普格县| 冷水江市| 壤塘县| 玉门市| 兴化市| 资兴市| 巩留县| 石景山区| 综艺| 荃湾区| 尼勒克县| 西华县| 田林县| 云南省| 迭部县| 泽库县| 湖南省| 永城市| 黑山县| 台南市| 梧州市| 高唐县| 马公市| 新安县| 镇宁| 定南县| 塔城市| 醴陵市| 叶城县| 夏津县| 文昌市|