例如,当我尝试发送具有这些值 [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())
。
关于arrays - 如何在protobuf重复字段中发送0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59097077/