【问题标题】:Can I set a maximum value for a number in protobuf?我可以为 protobuf 中的数字设置最大值吗?
【发布时间】:2017-12-03 11:29:01
【问题描述】:

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

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

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

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

有没有办法做到这一点?

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

【问题讨论】:

    标签: size protocol-buffers limit options proto3


    【解决方案1】:

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

    但是,一些第三方实现确实包含此类支持。

    例如,我自己的 nanopb 有int_size option

    int_size: 覆盖字段的整数类型。 (使用例如 uint8_t 来节省 RAM。)

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

    【讨论】:

    • 知道这一点非常有用,我实际上在 arduino 上使用 nanopb!不幸的是,这并不完美,因为消息也在不直接与 arduino 通信的应用程序之间发送,因此他们不会知道这些限制。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2021-08-24
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多