为了账号安全,请及时绑定邮箱和手机立即绑定

golang protobuf 封送固定大小的空结构

golang protobuf 封送固定大小的空结构

Go
呼唤远方 2023-04-24 17:01:55
我有一个 protobuf 结构Data在.proto:message Data {    uint64 ID = 1;    uint32 GUID = 2;}在高朗b, err := proto.Marshal(&pb.Data{})if err != nil {    panic(err)}fmt.Println(len(b))我有0长度!无论 pb.Data 是什么,我怎样才能使 proto.Marshal 始终返回固定大小?附言。pb.Data 只包含int64和int32
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

这里有两个问题

1) protobuf 对整数使用 varint 编码,因此大小取决于值,

2) 零值字段默认是不发送的,所以因为两个整数都是零,所以连它们的字段标识都不发送。

如果将它们都设置为 1,则字节数将多于零,但长度仍不固定,具体取决于值的范围

因此,通常没有真正的方法在 protobuf 消息中强制执行固定大小

如果你想要固定长度的消息,你可能最好使用直接的在线结构类型编码,但是这对于语言互操作来说更难,因为它们都必须定义相同的消息并且你会失去简单的消息迁移以及 protobuf 提供的所有很酷的东西。

Cap'n Proto可能有固定大小结构的选项,但它们通常也会压缩,这将再次产生可变长度的消息。

如果您描述了您试图最终解决的问题,我们可能会建议其他替代方案。


查看完整回答
反对 回复 2023-04-24
?
慕村9548890

TA贡献1884条经验 获得超4个赞

您正在调用len()一个字节数组。它将计算该数组中元素的数量,并返回它。

如果您刚刚实例化了一个新的、空的、内部没有任何内容的 protobuf 指针对象,那么封送处理的字节数组将不会保存任何数据——这就是为什么您得到0.

我很不确定你想让它返回什么。你能用你想要的输出来澄清你的问题吗?我也许可以更好地回答你的问题。


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信