【问题标题】:protocol buffers : no notation for fixed size buffers?协议缓冲区:没有固定大小缓冲区的符号?
【发布时间】:2012-04-10 15:12:01
【问题描述】:

由于我没有得到关于this 问题的答案,我必须制作原型并检查自己,因为我的数据集标题需要固定大小,所以我需要固定大小的字符串。那么,是否可以在协议缓冲区中指定固定大小的字符串或字节数组?这在这里并不明显,我对将固定大小的字符串强制放入标题消息感到有点难过。 --即std::string('\0', 128);

如果不是,我宁愿使用#pragma pack(1) struct header {...};'

编辑

问题间接回答here。会回答和除外

【问题讨论】:

    标签: c++ protocol-buffers file-format


    【解决方案1】:

    protobuf 在协议中没有这样的概念,在 .proto 模式语言中也没有。在字符串和 blob 中,数据总是技术上使用长度前缀可变长度(它本身使用 varint 编码,所以即使长度也是可变长度)。

    当然,如果您只存储特定长度的数据,那么它会排成一行。另请注意,由于 protobuf 中的字符串是使用 UTF-8 编码的 unicode,因此编码数据的长度不与字符数一样简单(除非您仅使用 ASCII 字符)。

    【讨论】:

      【解决方案2】:

      这是对上一个答案的轻微澄清。 Protocol Buffers 不将字符串编码为 UTF-8,而是将它们编码为常规字节。在线格式将是消耗的字节数,后跟实际字节数。见https://developers.google.com/protocol-buffers/docs/encoding/。

      虽然在线格式始终相同,但协议缓冲区提供了两个接口供开发人员使用,字符串和字节,主要区别在于前者通常会尝试向开发人员提供字符串类型,而后者将尝试提供字节类型(即Java将为字符串提供String,为字节提供ByteArray)。

      【讨论】:

      • UTF-8 是一种 Unicode 编码——它将 Unicode 字符转换为字节。 Protobuf 使用 UTF-8 来获取常规字节。
      • @solidsnack 感谢 unicode 的定义,虽然这里不相关。关键是协议缓冲区将字符串(或字节)存储为 type=2,长度分隔。协议缓冲区不关心这些字节是什么,也不会任意强制这些字节为 UTF-8。
      • 考虑developers.google.com/protocol-buffers/docs/encoding#strings 的示例,其中显示“蓝色字节是“测试”的 UTF8”。
      • "Protocol Buffers 不将字符串编码为 UTF-8,而是将它们编码为常规字节。" - 没有“常规字节”编码,但有 UTF-8 编码,它指定如何将字符串编码为“常规字节”。
      • 虽然协议缓冲区在网络上以相同的方式表示字符串和字节,但它仍然明确地specified string 字段必须编码为字节:A string must always contain UTF-8 encoded or 7-bit ASCII text。换一种说法,您始终可以手动将字符串编码为字节,并采用您希望的任何编码。但是,如果您使用标准协议缓冲区为您的目标语言生成 string 访问器,则编码将是 UTF-8/7 位 ASCII。
      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2014-10-10
      • 2021-12-19
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多