如何在 protobuf 重复字段中发送 0?
How to send 0 in protobuf repeated field?
例如,当我尝试发送具有这些值 [14,56,0,63,22,6] 的数组时,我的客户端只收到
零 [14,56] 之前的值。我知道默认值没有序列化,但是这个 0 在重复字段中。那么是否可以使用 protobuf 消息通过网络发送整个数组?
syntax = "proto3";
package server;
message SrvPossibleMoves {
int32 id = 1;
int32 index = 2;
repeated int32 moves = 3 [packed=false];
}
So is it possible to send the whole array over the wire with protobuf message?
是:0作为重复字段中的值绝对没有特殊含义。您可以发送 5 个 0,或 20,或 201——这完全没有区别。
my client receives only the values before the zero
出了点问题。您的客户端(或可能在您的服务器)很可能存在错误。
(评论中的扩展版查询)
这听起来是典型的中间代码问题(不是 protobuf 库本身,而是在传递字节时出现的问题)将有效负载视为 C 风格(以 nul 结尾)的字符串。这种情况下的零值将被编码为零字节,这在二进制数据中是完全有效的,但这会导致 C 风格的字符串处理 API 在该点切割数据。我会 期望 大多数 protobuf 库检测到它期待额外的值(在某些情况下这是可能的,而在某些情况下是不可能的;在这种情况下 - 它似乎是可能的),并在此时抛出异常,但是......那将是特定于库的。
因此:检查 C 风格字符串处理的代码,并删除任何此类 - 通常通过一致传递长度和有效负载(而不是依赖终止符)。
在这种情况下,违规代码是:std::strlen(data_.get())
。
例如,当我尝试发送具有这些值 [14,56,0,63,22,6] 的数组时,我的客户端只收到 零 [14,56] 之前的值。我知道默认值没有序列化,但是这个 0 在重复字段中。那么是否可以使用 protobuf 消息通过网络发送整个数组?
syntax = "proto3";
package server;
message SrvPossibleMoves {
int32 id = 1;
int32 index = 2;
repeated int32 moves = 3 [packed=false];
}
So is it possible to send the whole array over the wire with protobuf message?
是:0作为重复字段中的值绝对没有特殊含义。您可以发送 5 个 0,或 20,或 201——这完全没有区别。
my client receives only the values before the zero
出了点问题。您的客户端(或可能在您的服务器)很可能存在错误。
(评论中的扩展版查询)
这听起来是典型的中间代码问题(不是 protobuf 库本身,而是在传递字节时出现的问题)将有效负载视为 C 风格(以 nul 结尾)的字符串。这种情况下的零值将被编码为零字节,这在二进制数据中是完全有效的,但这会导致 C 风格的字符串处理 API 在该点切割数据。我会 期望 大多数 protobuf 库检测到它期待额外的值(在某些情况下这是可能的,而在某些情况下是不可能的;在这种情况下 - 它似乎是可能的),并在此时抛出异常,但是......那将是特定于库的。
因此:检查 C 风格字符串处理的代码,并删除任何此类 - 通常通过一致传递长度和有效负载(而不是依赖终止符)。
在这种情况下,违规代码是:std::strlen(data_.get())
。