
2021-03-18 varint编码测试
将整数值取其右边的7位,作为当前字节的低7位。 将最高位(第8位)设置为1(即0x80)。 将当前字节添加到结果流中。 将剩余的高位右移7位,重复步骤1-3,直到处理完所有位。 从字节流中读取每个字节。 提取低7位并累加到结果中。 检查当前字节的最高位是否为1:
发布日期:2021-05-15 08:34:24
浏览次数:20
分类:精选文章
本文共 1007 字,大约阅读时间需要 3 分钟。
Protobuf varint 编码机制解析
varint 编码特性
ProtoBuf中的varint编码是一种高效的变长整数编码方式,广泛应用于网络协议和数据存储领域。其核心特性如下:
小端编码:varint采用小端存储方式,最高位(第7位)用于控制后续连续的7位。
- 当最高位为0时,表示当前字节即为编码结果的最后一个字节,最高位永远为0。
编码范围:
- 对于32位整数,varint编码后最多占5个字节。
- 对于64位整数,编码后最多占9个字节。
特殊情况处理:
- 当整数值小于等于63时,varint编码仅占1个字节,最高位被占用(0x7F)。
varint 编码逻辑
编码过程
解码过程
- 如果为1,继续处理下一个字节。
- 如果为0,结束解码,当前字节即为最终结果。
测试示例
整数值转varint编码
int64_t t = 64;std::string str;ToVarInt(t, str);
- 编码结果:
0x7F
(仅1个字节)
varint解码示例
std::string str = "feff";int64_t nt = FromVarInt(str);
- 解码结果:
0x00000000000000feff
字节流分析
// 字节流表示:0xfe 0xff// 解码过程:// - 读取0xfe:低7位为0xfe(0xfe = 254),累加到结果中。// - 检查最高位:0xfe & 0x80 = 0x80 → 1,继续处理下一个字节。// - 读取0xff:低7位为0xff(255),累加到结果中。// - 检查最高位:0xff & 0x80 = 0x80 → 1,继续处理下一个字节。// - 由于此时字节流已结束,最高位为0,结束解码。// 最终结果:0xff + (0xfe << 7) = 0xfeff
结论
通过上述分析,可以清晰地看到varint编码方式的核心逻辑。其高效性在于能将整数值压缩到尽可能少的字节中,同时保持灵活的解码能力。理解varint编码机制对理解ProtoBuf数据格式至关重要。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月21日 10时13分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1
2019-03-12
JQuery--手风琴,留言板
2019-03-12
MFC 自定义消息发送字符串
2019-03-12
Linux操作系统的安装与使用
2019-03-12
C++ 继承 详解
2019-03-12
OSPF多区域
2019-03-12
Grafana导入 Promethus node模板
2019-03-12
如何提高SQL查询的效率?
2019-03-12
Docker入门之-镜像(二)
2019-03-12
数据结构——链表(3)
2019-03-12
socket模块和粘包现象
2019-03-12
去了解拉绳位移编码器的影响因素
2019-03-12
无法初始化Winsock2.2处理
2019-03-12
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
2019-03-12
重置UAG Application admin密码
2019-03-12
Horizon Daas租户管理平台扩展分配时报:内部错误
2019-03-12
项目计划甘特图绘制说明
2019-03-12
嵌入式系统试题库(CSU)
2019-03-12
图神经网络7日打卡营学习心得
2019-03-12
electronJS 开发linux App
2019-03-12