协议缓冲区:没有固定大小缓冲区的标记?

12

由于我在这个问题上没有得到答案,我必须自己进行原型验证,因为我的数据集头需要固定大小,所以我需要固定大小的字符串。那么,在协议缓冲区中是否可以指定固定大小的字符串或字节数组?在这里没有明显地显示出来,而且我也觉得把固定大小的字符串强行放入头消息中有点不好--即:std :: string('\0',128);

如果不行,我宁愿使用#pragma pack(1) 结构体 头{...};'

编辑

问题在 这里间接得到回答。将回答并接受

2个回答

7

在协议中和.proto模式语言中,protobuf没有这样的概念。在字符串和二进制大对象中,数据始终是使用长度前缀(本身使用varint编码,因此甚至长度也是可变长度)的技术上可变长度。

当然,如果您只存储特定长度的数据,则它将排列好。还要注意,由于protobuf中的字符串使用UTF-8编码的Unicode,因此编码数据的长度不像字符数那样简单(除非您仅使用ASCII字符)。


2
这是对之前答案的一个小澄清。Protocol Buffers将字符串编码为UTF-8,它将其编码为普通字节。在传输过程中,会先传输占用的字节数,然后是实际的字节。详情请参见https://developers.google.com/protocol-buffers/docs/encoding/
虽然传输格式始终相同,但Protocol Buffers提供了两个接口供开发人员使用:字符串和字节,主要区别在于前者通常尝试向开发人员提供字符串类型,而后者则尝试提供字节类型(例如,在Java中,字符串使用String表示,而字节使用ByteArray表示)。

5
UTF-8是Unicode的一种编码方式--它将Unicode字符转换成字节。Protobuf使用UTF-8来获取普通字节。 - solidsnack
1
请参考 https://developers.google.com/protocol-buffers/docs/encoding#strings 中的示例,其中写着“蓝色字节是“testing”的UTF8”。 - solidsnack
1
Protocol Buffers 不会将字符串编码为 UTF-8,而是将其编码为普通字节。虽然没有“普通字节”编码方式,但有 UTF-8 编码方式,它指定了如何将字符串编码为“普通字节”。 - Alex Che
1
尽管协议缓冲区在传输时以相同的方式表示字符串和字节,但仍然明确指定了如何将 string 字段编码为字节:字符串必须始终包含 UTF-8 编码或 7 位 ASCII 文本。换句话说,您可以手动将字符串编码为字节,并使用任何编码。但是,如果您使用目标语言的标准协议缓冲区生成的 string 访问器,则编码将为 UTF-8/7 位 ASCII。 - Alex Che
1
@Clarus 我不认为我会混淆它。实际上,我已经在我的评论中说明了协议中没有区分字符串和字节。但是,来自Google的protobuf规范明确指出字符串必须使用UTF-8 / 7位ASCII进行编码。也就是说,这不是偶然的,而是一个明确的要求。因此,如果您希望您的字符串与其他protobuf绑定实现兼容,那么您必须遵守这种编码方式。是的,您可以手动编码不同编码的字符串,但这样它就不符合Google对protobuf字符串的定义了。 - Alex Che
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接