协议缓冲区:确切长度的字符串或字节序列

Posted

技术标签:

【中文标题】协议缓冲区:确切长度的字符串或字节序列【英文标题】:protocol-buffers: string or byte sequence of the exact length 【发布时间】:2022-01-20 13:27:58 【问题描述】:

查看https://developers.google.com/protocol-buffers/docs/proto3#scalar 似乎 stringbytes 类型不限制长度?这是否意味着我们需要在单独的字段中指定传输字符串的长度,例如:

message Person 
  string name = 1;
  int32 name_len = 2;
  int32 user_id = 3;
  ...

【问题讨论】:

【参考方案1】:

用于string/byte 的wire type 是Length-delimited。这意味着消息包括字符串长度。如何向您提供这将取决于您使用的语言 - 例如,the table 表示在 C++ 中使用了 string 类型,因此您可以调用 name.length() 来检索长度。

因此无需在单独的字段中指定长度。

【讨论】:

【参考方案2】:

我希望 GPB 做的一件事是允许架构用于设置对列表/数组长度或数值范围等事物的约束。最好在.proto文件中加注释,希望程序员注意!

其他序列化技术可以做到这一点,例如 XSD(尽管这些工具通常很差)、ASN.1 和 JSON 模式。它非常有用。如果 GPB 添加了这些(它不会更改线路格式),那么 GPB 将非常“完整”。

【讨论】:

以上是关于协议缓冲区:确切长度的字符串或字节序列的主要内容,如果未能解决你的问题,请参考以下文章

命名管道,如何知道在读取端读取的确切字节数。 C++, 视窗

谷歌协议缓冲区是不是支持序列化前的大小计算?

8086汇编语言(续) 字符串输入和显示

反序列化协议缓冲区c ++中的字符串数组

理解字符串转义序列

base64