整数的Varint编码

举报
张俭 发表于 2023/12/30 20:06:24 2023/12/30
4475 0
【摘要】 Varint编码 一个简单的消息假设你有如下的protobuf定义syntax = "proto3";package test;option go_package = "test";message Test1 { optional int32 a = 1;}在应用中,你创建了一个TestMessage实例,将a设置为150。接下来将消息序列化。检查序列化后的消息,你会发现是这么一个字节数...

Varint编码

一个简单的消息

假设你有如下的protobuf定义

syntax = "proto3";
package test;
option go_package = "test";

message Test1 {
  optional int32 a = 1;
}

在应用中,你创建了一个TestMessage实例,将a设置为150。接下来将消息序列化。检查序列化后的消息,你会发现是这么一个字节数组

0x08 0x96 0x01

Base 128 Varints

这是一个varints编码。varints是一种使用1个或多个字节来序列化整数的方式。更小地数字占更少的字节。

varint 中的每个字节,除了最后一个字节,都设置了最高有效位 (msb)——这表明还有更多的字节需要处理。 每个字节的低 7 位用于以 7 位为一组存储数字的二进制补码表示,采用小端字节存储。

举个例子,对于1来说,由于只有1个字节,所以没有设置msb

0000 0001

这是300,有一些复杂

1010 1100 0000 0010

怎么发现这是300的?首先,先把每个字节的msb去掉,变换为

010 1100 000 0010

再进行小端转换,变为

000 0010 010 1100

组合为

100101100

即就是300

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作
咦,数据开小差了,去别处转转先

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。