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

时间:2019-11-28 23:15:19

标签: arrays list networking null protocol-buffers

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

2 个答案:

答案 0 :(得分:1)

  

那么有可能通过protobuf消息通过导线发送整个阵列吗?

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

  

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

有些事情是非常错误的。您的客户端(或服务器中)很可能存在错误。

答案 1 :(得分:1)

(注释中查询的扩展版本)

这听起来是中间代码(不是protobuf库本身,而是传递字节时的东西)存在的典型问题,正在将有效载荷视为C样式(以零结尾)的字符串。在这种情况下,零值将被编码为零字节,这在二进制数据中是完全有效的,但是这将导致C风格的字符串处理API在那一点上剪切数据。我会期望大多数protobuf库来检测是否期望附加值(在某些情况下这是可能的,在某些情况下是不可能的;在这种情况下-似乎是可能的),并且此时抛出一个异常,但是...这将是特定于库的。

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


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