外贸营销网站建设方案,重庆市建设施工安全网,wordpress站内优化,网页设计摘要Protobuf的编码方式 Varints是一种紧凑表示数字的办法。他用一个或者多个字节表示一个数字#xff0c;值越小的数字节节数越少。相对与传统的用4字节表示int32类型的数字#xff0c;Varints对于小于128的数值都可以用一个字节表示#xff0c;大于128的数值会用更多的字节来表…Protobuf的编码方式 Varints是一种紧凑表示数字的办法。他用一个或者多个字节表示一个数字值越小的数字节节数越少。相对与传统的用4字节表示int32类型的数字Varints对于小于128的数值都可以用一个字节表示大于128的数值会用更多的字节来表示对于很大的数据则需要用5个字节来表示。 Varint一字节就有八位第一位作为一个标志位剩下七位用来存储如果七位不够存就再加一字节增加的这个字节第一位一样是标志位但是这个标志位会默认为零。所以只有第一个字节的标志位才有意义如果超过四字节就不需要用可变长整型了就用64-bit。
数据类型varint0 、64-bit1 、Length-delimited2 、Start group3、End group4 、32-bit5
解码第一个字节做拆分 -第一个字节的后三位为数据类型前五位为序号而前五位的第一位是表示类型和字段是不是要扩充。 其他字节就是编码后的值 比如得到第一个字节8和第二个字节1那么就是 0000 1000后三位就是000那么类型就是00为varint而0000 1为1所以ver为10000 1中的第一位为0为不需要扩充 1为 0000 0001 为1且第一位为0不需要扩充所以值为1得到 1 0 1 。 总结序号为1类型为0值为1 再比如10 ffffff91 3 。第一个字节为10因为是16进制所以为 0001 0000后三位为000为00为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 256128161 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);//解析字符串