protobuf序列化解码原理
创始人
2024-05-30 04:36:08
0

Protobuf的编码方式

Varints是一种紧凑表示数字的办法。他用一个或者多个字节表示一个数字,值越小的数字节节数越少。相对与传统的用4字节表示int32类型的数字,Varints对于小于128的数值都可以用一个字节表示,大于128的数值会用更多的字节来表示,对于很大的数据则需要用5个字节来表示。

Varint:一字节就有八位,第一位作为一个标志位,剩下七位用来存储,如果七位不够存,就再加一字节,增加的这个字节第一位一样是标志位,但是这个标志位会默认为零。所以只有第一个字节的标志位才有意义,如果超过四字节就不需要用可变长整型了,就用64-bit。

数据类型:varint(0) 、64-bit(1) 、Length-delimited(2) 、Start group(3)、End group(4) 、32-bit(5)

解码:第一个字节做拆分 ->第一个字节的后三位为数据类型,前五位为序号,而前五位的第一位是表示类型和字段是不是要扩充。
其他字节就是编码后的值

比如得到第一个字节8和第二个字节1,那么就是 0000 1000,后三位就是000,那么类型就是0,0为varint,而0000 1为1,所以ver为1,0000 1中的第一位为0为不需要扩充
1为 0000 0001 为1且第一位为0,不需要扩充,所以值为1,得到 1 : 0 : 1 。
总结:序号为1,类型为0,值为1

再比如10 ffffff91 3 。第一个字节为10,因为是16进制,所以为 0001 0000,后三位为000,为0,0为varint,而0001 0,为2,那么ver为2,第一位为0表示第一个字节表示的类型和序号不需要扩充
ffffff91为 1001 0001,因为第一个字节不需要扩充,那么这个字节就是值,第一位为1,表示需要扩充,所以需要和后一个字节组合
3 为 0000 0011,第一位为0表示不需要扩充,所以只需要ffffff91中的001 0001和3中的000 0011组合根据前面的在后面,后面的在前面,
得到 000 0011 001 0001 = 256+128+16+1 = 401
总结:序号为2,类型为0,值为401

再比如1a 4 68 61 6e 6b。第一个1a为0001 1010,类型为2为Length-delimiteda,序号为3,第一位为0不需要扩充
因为类型是定长的字符串,所以后面的4为字符串程度,后面四个数为字符串的ascll编码
总结:序号为3,类型为2,值为hank

思考:在第一位存序号的位数中最大只能存15,那么如果序号大于15怎么办?

比如f8 1 f,第一个字节为1111 1000,后三为0,类型为varint,第一位为1,说明存类型和序号的第一个字节需要扩充,第二个字节为0000 0001,第二个字节的第一位为0,所以不需要再继续拼接, 根据前在后,后在前得到000 0001 1111为31,所以序号为31,第三个字节为0000 1111,第一位为0说明不需要扩充,得到值为15
总结:序号为31,类型为0,值为15

两个重要办法:

.SerializeToArray(char *data, int len);//转为字符串data
.ParseFromArray(char *data, int len);//解析字符串

相关内容

热门资讯

写快乐的一件事三年级的作文3... 篇一:快乐的一件事在我三年级的时候,有一次我和妈妈一起去公园玩,那是一个阳光明媚的周末早上。我们带了...
秦皇岛黄金海岸游记三年级作文... 秦皇岛黄金海岸游记三年级作文 篇一我和家人去了秦皇岛黄金海岸度假,这是我人生中最美好的一次旅行。黄金...
一次旅行的经历作文三年级作文... 一次旅行的经历作文三年级作文 篇一我最难忘的一次旅行是和爸爸妈妈去海边玩的那次。那是一个阳光明媚的早...
三年级看图写作文借伞【优质6... 三年级看图写作文借伞 篇一今天,我们班级进行了一次有趣的活动,每个同学都被要求写一篇关于“借伞”的作...
三年级上册语文句子复习(优质... 三年级上册语文句子复习 篇一在三年级上册的语文学习中,我们学习了许多句子,现在让我们来进行一次复习吧...
三年级作文这一次我被感动了4... 篇一:三年级作文这一次我被感动了43篇这一次我被感动了43篇作文,这是我在三年级最难忘的一次经历。这...
木鱼岛小学三年级作文300字... 木鱼岛小学三年级作文300字 篇一我的梦想我是木鱼岛小学三年级的学生,我的名字叫小明。我有一个美丽的...
三年级的海边作文200字【精... 三年级的海边作文200字 篇一我在海边玩耍今天是个晴朗的日子,我和爸爸妈妈一起去海边玩耍。海边的沙滩...
三年级作文我的爸爸300字(... 三年级作文我的爸爸300字 篇一我的爸爸是一个非常疼爱我的人。他虽然有时候工作很忙,但是每天晚上都会...
我的植物朋友三年级作文(精彩... 我的植物朋友三年级作文 篇一我的植物朋友我家有一盆小红花,它是我的植物朋友。我每天都会给它浇水,晒太...
我的中秋节三年级作文400字... 我的中秋节三年级作文400字 篇一我和家人一起过中秋节中秋节是中国的传统节日,我和家人一起过了一个特...
三年级作文我可爱的小妹妹(推... 三年级作文我可爱的小妹妹 篇一我家有一个可爱的小妹妹,她叫小婷婷。她今年三岁,是一个活泼开朗的小女孩...
有万里长城作文三年级【优质6... 有万里长城作文三年级 篇一万里长城是中国古代的伟大工程,也是世界上最长的人类建筑物。长城是由很多砖石...
家乡一角100字作文三年级【... 家乡一角100字作文三年级 篇一我家乡的一角是一个美丽的公园。公园里有一片绿草地,上面开满了五颜六色...
小学三年级作文500字【实用... 小学三年级作文500字 篇一我最喜欢的动物我最喜欢的动物是猫咪。猫咪有着柔软的毛发和灵活的身体。它们...
独自走在小路上【最新5篇】 独自走在小路上 篇一独自走在小路上,我感受到了一种独特的自由和宁静。小路被绿树环绕,阳光透过树叶间的...
三年级下册同步作文【通用3篇... 三年级下册同步作文 篇一我的偶像我有一个偶像,她是我最喜欢的歌手——Taylor Swift。Tay...
我的课余生活小学三年级作文【... 我的课余生活小学三年级作文 篇一:我的快乐课余时光  我的课余生活非常丰富多彩,充满了快乐和乐趣。我...
作文三年级夏天的晚上(经典6... 作文三年级夏天的晚上 篇一夏天的晚上,天空透露着一丝温暖,草地上的小虫子们也开始活跃起来。我喜欢夏天...
小学生三年级作文【经典6篇】 小学生三年级作文 篇一:我的暑假计划暑假即将来临,我已经计划好了如何度过这个快乐的假期。首先,我准备...