我可以为 protobuf 中的数字设置最大值吗?

Can I set a maximum value for a number in protobuf?

在protobuf中,我们只能选择使用有符号或无符号的32位或64位整数来限制值的范围。

但是,我要定义的数据结构包含 8 位、16 位和 32 位整数的混合,以便在嵌入式设备上保存 space。在它们上面,数据结构的实现也有些不同,并且需要为某些字段保留特殊值,因此它们的最大数量不是 2 的幂。

在这些嵌入式设备上,protobuf 定义仅用于与它们之间的传输,而不用于实际存储。所以我可以在读入时限制数字。

但是,我宁愿在 .proto.options 文件中定义这些最大值,以确保所有客户端应用程序都知道这些限制。

有办法吗?

我知道有字段选项,但列出的选项 here 不包含此选项。可以创建自定义选项,但这似乎需要编写编译器扩展,这意味着我必须为我想编译成的每种语言手动实施此限制检查,而且这比节省的时间要多。

不,没有用于表达该意图的语法,也没有内置工具/代码生成器可以强制执行您要添加的规则。您需要手动处理。

默认情况下,这在 protobuf 中是不可能的,并且规范不包含强制执行此类限制的语法。

但是,某些第三方实现 包括此类支持。

比如我自己的nanopb有int_size option:

int_size: Override the integer type of a field. (To use e.g. uint8_t to save RAM.)

如果值不适合该字段,这将 return 在运行时从 pb_decode() 产生错误。