Protocol buffers Can.proto文件';字段从零开始?

Protocol buffers Can.proto文件';字段从零开始?,protocol-buffers,Protocol Buffers,.proto示例似乎都从一开始对字段进行编号 e、 g 如果可以使用零,则会使某些消息小一个或多个字节(即一个或多个字段号为16的消息) 由于键只是(fieldnum的变量编码,一个非常直接的原因是零字段号被protoc拒绝: test.proto:2:28: Field numbers must be positive integers. 至于为什么协议缓冲区是这样设计的,我只能猜测。这样做的一个好结果是,满是零的消息将被检测为无效。它还可以在协议缓冲区实现中作为返回值在内部指示“无字段”

.proto示例似乎都从一开始对字段进行编号

e、 g

如果可以使用零,则会使某些消息小一个或多个字节(即一个或多个字段号为16的消息)


由于键只是(fieldnum的变量编码,一个非常直接的原因是零字段号被
protoc
拒绝:

test.proto:2:28: Field numbers must be positive integers.
至于为什么协议缓冲区是这样设计的,我只能猜测。这样做的一个好结果是,满是零的消息将被检测为无效。它还可以在协议缓冲区实现中作为返回值在内部指示“无字段”

分配标记

如您所见,消息定义中的每个字段都有一个唯一的编号标记。这些标记用于以消息二进制格式标识字段,并且在使用消息类型时不应更改。请注意,值在1到15之间的标记需要一个字节进行编码,包括标识号和字段类型(您可以在协议缓冲区编码中了解更多信息)。范围为16到2047的标记占用两个字节。因此,您应该为非常频繁出现的消息元素保留标记1到15。请记住为将来可能添加的频繁出现的元素留出一些空间

您可以指定的最小标记号为1,最大标记号为229-1或536870911。您也不能使用数字19000到19999(FieldDescriptor::KFirstServedNumber到FieldDescriptor::KlasterServedNumber),因为它们是为协议缓冲区实现保留的-如果您在.proto中使用这些保留的数字之一,协议缓冲区编译器会抱怨。同样,您不能使用任何以前保留的标记


正如文档中所说,无法检测到0。

啊,我没有意识到这一点,因为我使用自己的JS库来处理protobufs。我也会将零字段号设置为非法。旧的proto1代码(从未公开发布)有评论认为标记零可能被用来表示错误,尽管我从未见过实际执行此操作的代码。也许这是一个很早就被删除的功能。无论如何,对零编号字段的禁止仍然存在,而且可以说它很有用,因为它捕捉到了那些无意识地将protobuf消息和expec归零的人我正要问这个问题,因为作为程序员,我们习惯于从零开始。谢谢你的提问!
test.proto:2:28: Field numbers must be positive integers.