如何在 protobuf 重复字段中发送 0?



例如,当我尝试发送具有这些值[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];
}

(评论中查询的扩展版本(

这听起来典型的中间代码问题(不是 protobuf 库本身,而是传递字节时的东西(将有效负载视为 C 样式(以 nul 结尾(字符串。此方案中的零值将被编码为零字节,这在二进制数据中完全有效,但会导致 C 样式的字符串处理 API 在该点剪切数据。我希望大多数 protobuf 库都能检测到它需要额外的值(在某些情况下这是可能的,有些是不可能的;在这种情况下 - 这似乎是可能的(,并在这一点上抛出异常,但是......这将是特定于图书馆的。

所以:检查 C 样式字符串处理的代码,并删除任何此类代码 - 通常通过一致传递长度和有效负载(而不是依赖终止符(。


在这种情况下,有问题的代码是:std::strlen(data_.get())

那么是否有

可能通过带有 protobuf 消息的线路发送整个数组?

是的:0 作为重复字段中的值绝对没有特殊含义。你可以发送5个0,20或201 - 这绝对没有区别。

我的客户端只收到零之前的值

有些事情很不对劲。很可能您的客户端(或可能在服务器中(存在错误。

相关内容

  • 没有找到相关文章

最新更新