golang protobuf 封送固定大小的空结构
golang protobuf marshal empty struct with fixed size
我有一个 protobuf 结构 Data
在.proto
中:
message Data {
uint64 ID = 1;
uint32 GUID = 2;
}
在 golang 中
b, err := proto.Marshal(&pb.Data{})
if err != nil {
panic(err)
}
fmt.Println(len(b))
我得到了0
长度!
无论 pb.Data 是什么,我怎样才能使 proto.Marshal 总是 return 固定大小?
ps.
pb.Data只包含int64
和int32
您正在对字节数组调用 len()
。它将计算该数组中元素的数量,并 return 它。
如果您刚刚实例化了一个新的、空的、内部没有任何内容的 protobuf 指针对象,则编组的字节数组将不会保存任何数据——因此您得到 0
.
我不太确定您想要什么 return。你能用你想要的输出来澄清你的问题吗?我也许可以更好地回答你的问题。
这里有两个问题
1) protobuf 对整数使用 varint 编码,因此大小取决于值,参见 this link
2) 零值域默认是不传输的,所以因为两个整数都是零,所以连它们的域标识都不传输。我实际上不确定是否有发送零值的选项查看 the docs
如果将它们都设置为 1,则字节数将多于零,但长度仍不固定,具体取决于值的范围
所以,通常没有真正的方法在 protobuf 消息中强制执行固定大小
如果你想要固定长度的消息,你可能最好使用直接的在线结构类型编码,但是这对于语言互操作来说更难,因为它们都必须定义相同的消息,而你' d 失去简单的消息迁移和 protobuf 提供的所有很酷的东西。
Cap'n Proto 可能有固定大小结构的选项,但它们通常也会压缩,这将再次产生可变长度的消息。
如果您描述了您试图最终解决的问题,我们可能会建议其他替代方案。
我有一个 protobuf 结构 Data
在.proto
中:
message Data {
uint64 ID = 1;
uint32 GUID = 2;
}
在 golang 中
b, err := proto.Marshal(&pb.Data{})
if err != nil {
panic(err)
}
fmt.Println(len(b))
我得到了0
长度!
无论 pb.Data 是什么,我怎样才能使 proto.Marshal 总是 return 固定大小?
ps.
pb.Data只包含int64
和int32
您正在对字节数组调用 len()
。它将计算该数组中元素的数量,并 return 它。
如果您刚刚实例化了一个新的、空的、内部没有任何内容的 protobuf 指针对象,则编组的字节数组将不会保存任何数据——因此您得到 0
.
我不太确定您想要什么 return。你能用你想要的输出来澄清你的问题吗?我也许可以更好地回答你的问题。
这里有两个问题
1) protobuf 对整数使用 varint 编码,因此大小取决于值,参见 this link
2) 零值域默认是不传输的,所以因为两个整数都是零,所以连它们的域标识都不传输。我实际上不确定是否有发送零值的选项查看 the docs
如果将它们都设置为 1,则字节数将多于零,但长度仍不固定,具体取决于值的范围
所以,通常没有真正的方法在 protobuf 消息中强制执行固定大小
如果你想要固定长度的消息,你可能最好使用直接的在线结构类型编码,但是这对于语言互操作来说更难,因为它们都必须定义相同的消息,而你' d 失去简单的消息迁移和 protobuf 提供的所有很酷的东西。
Cap'n Proto 可能有固定大小结构的选项,但它们通常也会压缩,这将再次产生可变长度的消息。
如果您描述了您试图最终解决的问题,我们可能会建议其他替代方案。