官方文件《协议缓冲区》(Protocol Buffers)https://developers.google.com/protocol-buffers/docs/proto3规定,Protobuf消息中字段的最大字段号为2^29-1。但是,为什么会有这个限制呢?有没有人能够详细解释一下呢?我是新手,请讲得通俗易懂一些。
我在Stack Overflow上看到了对这个问题的回答,但是还是不太明白。
我在Stack Overflow上看到了对这个问题的回答,但是还是不太明白。
#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE) \
static_cast<uint32>((static_cast<uint32>(FIELD_NUMBER) << 3) | (TYPE))
我怀疑这只是为了解码和处理字段头(线路类型和标记号)作为32位值。线路类型始终是最不重要的3位,留下29位用于标记号。从技术上讲,“varint”应该支持64位,但限制在合理的数字范围内是有意义的,因为“varint”编码意味着较大的数字需要更多的字节来编码。
编辑:我现在意识到这与链接的帖子类似,但...它仍然是真实的!Protobuf中的每个字段都以“varint”为前缀,表示后面跟随的字段(标记号)以及数据类型(线路类型)。后者尤其重要,以便可以正确存储或跳过意外字段(版本差异)。对于大多数框架来说,使该字段头轻松处理非常方便,而且大多数框架都可以使用32位整数。
这是一个问题而不是评论,在文档中写道:
范围在16到2047的字段号占用两个字节。因此,您应该为非常频繁出现的消息元素保留1到15号码。记得留出一些空间,以便将来可能添加的频繁出现的元素。
因为对于第一个字节,前5位用于字段号,后3位用于字段类型,所以字段号从31(因为0未使用)到2047需要占用两个字节吗?(我还猜测第二个字节的低3位也用于字段类型...我正在阅读中,所以等我弄清楚了再修正它)