首页 > 其他分享 >Varint编码

Varint编码

时间:2023-08-29 23:34:34浏览次数:39  
标签:Varint 编码 0000 idx val buf

Varint编码

规则

  1. 用7个比特位存储整数的值的部分,最高位(第8位)标识是否还有后续字节。

    0表示是最后一个字节

    1表示后面还有

  2. 后续字节的每个字节的最高位都是1,其余7位存储整数的值的部分。

案例

以32为int为例

  1. 值:1

    常规编码:0000 0000 0000 0000 0000 0000 0000 0001

    Varint编码: 0000 0001

  2. 值:123456

    常规编码:111 1000100 1000000

    每次从低到高取7位再加上有效位

    取7位:1000000,加上有效位:11000000

    取7位:1000100,加上有效位:01000100

    取7位:0000111,加上有效位:00000111

    Varint编码:11000000 01000100 00000111

  3. 值128:

    二进制:1000 0000

    取7位:000 0000,加上有效位:1000 0000

    取7位:000 0001,加上有效位:0000 0001

    Varint编码:1000 0000 0000 0001

代码


func EncodeVarint(val uint64) []byte {
	var buf [10]byte
	var idx int
	for idx = 0; val > 127; idx++ {
		buf[idx] = 0x80 | uint8(val&0x7f)
		val >>= 7
	}
	buf[idx] = uint8(val)
	idx++
	return buf[0:idx]
}

func DecodeVarint(buf []byte) (x uint64, n int) {
	for shift := uint(0); shift < 64; shift += 7 {
		if n >= len(buf) {
			return 0, 0
		}
		b := uint64(buf[n])
		n++
		x |= (b & 0x7F) << shift
		if (b & 0x80) == 0 {
			return x, n
		}
	}
	
	return 0, 0
}

标签:Varint,编码,0000,idx,val,buf
From: https://www.cnblogs.com/INnoVationv2/p/17666109.html

相关文章

  • Day10_字符编码
    1.字符编码的发展史: 2.utf-8的总结_1: 3.utf-8的总结_2: ......
  • 如何使用固定的编码来运行jar包
    在使用java-jar命令时指定编码java-Dfile.encoding=utf-8-jarxxx.jar注意:在Windows系统上执行命令时,只能用cmd,不能用PowerShell,否则报错!!!XTHS:为什么要这么做的?主要应该是在服务器是采用GBK编码模式的,在我本地是UTF-8的是没有问题的,但是在服务器就有问题了。Stri......
  • 优雅的对旋转编码器消抖(EC11,正交)
    环境:STM32SDK:Arduino(烧录了Arduino的bootloader)旋转编码器:EC11此处只处理正交编码器的A,B。在网上随意找的一个截图事宜,观看此图后,默认各位了解EC11的工作逻辑。  消抖的核心思路:A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状......
  • 使用editplus批量修改文件编码
     进行J2EE开发时,经常得拿现成的前端文件,如JS、CS、JSP、html等文件。把这些文件导入到webRoot(或webContent)时经常会出现“集体乱码”的情况(如下图所示),这是因为这些文件的编码格式为ansi编码与eclipse(或myeclipse)中工作空间编码的“gbk”("utf-8")不符。使用编辑器对每个文件进......
  • 二进制编码
    计算机内部所有信息(包括指令、数据等)都以二进制的形式存储和处理。数据在计算机中,所有数据都是以二进制的形式表示的。以下是不同类型数据的二进制表示方式的一些例子:整数:无符号整数:直接使用二进制表示数字的值。例如:5在8位二进制中表示为00000101有符号整数(通常使......
  • 12、从0到1实现SECS协议之SECS-I协议编码与解码
    12、从0到1实现SECS协议之SECS-I协议编码与解码1、SECS-I协议编码与解码实现这个感觉没有啥特别好说的,根据协议慢慢理解就好了,代码实现如下:packagepacketsimport( "encoding/binary" "fmt")/*------------------------------------- secs头-----------------------......
  • 哈夫曼树及哈夫曼编码 C++代码实现
     /*哈夫曼编码*/#include<iostream>usingnamespacestd;//********************************//构造哈夫曼树//********************************/*哈夫曼树顺序表的定义*/typedefstruct{intweight;intparent,lchild,rchild;}HTNode;typedefH......
  • 【算法记录】Java - Base64编码解码源码
    Base64编码表索引对应字符索引对应字符索引对应字符索引对应字符0A17R34i51z1B18S35j5202C19T36k5313D20U37l5424E21V38m5535F22W39n5646G23X40o5757H24Y41p5868I25Z42q5......
  • 【Java复杂系统实战经验-2023-08月】Java基础,Path路径计算编码
    Java程序设计-个人月报-2023-08月背景在本月,给负责的项目做了一次文件存储的迁移工作。历史原因,开发阶段由于图简便,使用了本地文件存储。后面经过容器化上云,导致应用出现上传文件分发的多节点的问题。本项工作的经验,受益于Java基础Path的一些API,颇有收获。复杂的系统应当构......
  • Linux下修改文件编码格式
    查看文件编码格式:filefishmails.csv.old修改文件编码格式:iconv-fiso-8859-1-tUTF-8fishmails.csv.oldt-o fishmails.csv ......