gpt4 book ai didi

protocol-buffers - 最大序列化 Protobuf 消息大小

转载 作者:行者123 更新时间:2023-12-04 16:22:01 29 4
gpt4 key购买 nike

有没有办法在序列化后获得某个 protobuf 消息的最大大小?

我指的是不包含“重复”元素的消息。

请注意,我指的不是具有特定内容的 protobuf 消息的大小,而是它可以达到的最大可能大小(在最坏的情况下)。

最佳答案

通常,由于存在未知字段的可能性,任何 Protobuf 消息都可以是任意长度。

如果您正在接收消息,则不能对长度做出任何假设。

如果您发送的是您自己构建的消息,那么您也许可以假设它只包含您知道的字段——但话又说回来,在这种情况下,您也可以轻松地计算出确切的消息大小。

因此,询问最大尺寸通常是没有用的。

话虽如此,您可以编写使用 Descriptor 的代码。用于迭代 FieldDescriptor 的接口(interface)s 表示消息类型 (MyMessageType::descriptor())。

见:https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor

类似的接口(interface)存在于 Java、Python 和可能的其他接口(interface)中。

以下是要实现的规则:

每个字段由一个标签和一些数据组成。

对于标签:

  • 字段编号 1-15 有一个 1 字节的标签。
  • 字段编号 16 及以上具有 2 字节标签。

  • 对于数据:
  • bool总是一个字节。
  • int32 , int64 , uint64 , 和 sint64最大数据长度为 10 个字节(是的,int32 可以是 10 个字节,如果它是负数,不幸的是)。
  • sint32uint32最大数据长度为 5 个字节。
  • fixed32 , sfixed32 , 和 float总是正好 4 个字节。
  • fixed64 , sfixed64 , 和 double总是正好 8 个字节。
  • 枚举类型字段的最大长度取决于最大枚举值:
  • 0-127:1 个字节
  • 128-16384:2 个字节
  • ...它是每字节 7 位,但希望你的枚举不是那么大!
  • 另请注意,负值将被编码为 10 个字节,但希望没有。
  • 消息类型字段的最大长度是消息类型的最大长度加上长度前缀字节。同样,长度前缀是每 7 位整数数据一个字节。
  • 组(您不应该使用它;它们是一个陈旧的旧功能,在 protobuf 甚至公开发布之前已被弃用)的最大大小等于内容的最大大小加上第二个字​​段标签(见上文)。

  • 如果您的消息包含以下任何内容,则其最大长度是无限的:
  • string 类型的任何字段或 bytes . (除非您知道它们的最大长度,在这种情况下,它是最大长度加上一个长度前缀,就像子消息一样。)
  • 任何重复的字段。 (除非你知道它的最大长度,在这种情况下,列表的每个元素都有一个最大长度,就好像它是一个独立的字段,包括标签。这里没有总长度前缀。除非你使用 [packed=true] ,在这种情况下,您必须查看详细信息。)
  • 扩展。
  • 关于protocol-buffers - 最大序列化 Protobuf 消息大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30915704/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com