首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解protocol buffers Varint规则?

如何理解protocol buffers Varint规则?
EN

Stack Overflow用户
提问于 2018-08-02 18:24:06
回答 1查看 142关注 0票数 1

我定义了一个proto消息:

代码语言:javascript
复制
message Header{
  required string name = 1;
  required int32 tabletype =2;
  required int32 version = 3;
  required int32 precision = 4;
  required int32 numfields = 5;
}

并使用protoc获取java文件;

然后我将值传递到每个字段;

代码语言:javascript
复制
    headerBuilder.setName("PLB");
    headerBuilder.setTabletype(84);
    headerBuilder.setPrecision(21);
    headerBuilder.setNumfields(4);
    headerBuilder.setVersion(0);

但事实上:

代码语言:javascript
复制
    for (byte b : header.toByteArray()) {
        System.out.print(b);
    }  

10 38 07 66 61 68 42 40 32 21 40 4

谁能告诉我为什么?

EN

回答 1

Stack Overflow用户

发布于 2018-08-03 16:59:00

您应该在这里期望的数字是十六进制的:

代码语言:javascript
复制
0A-03-50-4C-42-10-54-18-00-20-15-28-04

或以十进制表示:

代码语言:javascript
复制
10 3 80 76 66 16 84 24 0 32 21 40 4

所以:我认为你只是错误地转录了数据;与问题中的数字进行比较和对比:

代码语言:javascript
复制
10 38 07 66 61 68 42 40 32 21 40 4

现在去掉空格:

代码语言:javascript
复制
10380766616842403221404 -- mine
10380766616842403221404 -- yours

所以你有相同的十进制数字,但只是:空格错误-这很重要,因为显然1 2312 3非常不同。

关于为什么数据是0A-03-50-4C-42-10-54-18-00-20-15-28-04的,您可以插入数据into here来获得细目,但我将把它复制到这里:

0A =字段1,类型字符串

03 =长度3

有效负载= 50-4C-42

UTF8: PLB

10 =字段2,类型变量

54 = 84 (原始)或42 (Z字形)

18 =字段3,类型变体

00 =0(原始)或0 (zigzag)

20 =字段4,类型变量

15 = 21 (原始)或-11 (zigzag)

28 =字段5,类型变体

04 =4(原始)或2(Z字形)

(注意:由于历史原因,我的工具有一个拼写错误,其中Variant===Varint)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51651225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档