我可以在 protobuf 中描述恒定大小的消息吗?
I can describe constant size message in protobuf?
例如,我有下一条消息:
Message Header {
fixed32 messageType;
fixed32 messageSize;
}
我可以确定在任何平台上,在任何语言上,Header 都会被序列化为常量字节数组?
是的...大概,应该 是可预测的和固定大小的。有效负载是固定大小的,header 是 varint 编码的。这里有一个 轻微 问题是 varint 规范实际上并不禁止次优编码 - 它可以 理论上 最多包含 9 个额外的零字节仅设置连续位进行填充。但是实际上这不是问题。
因此:这些是解释为 varint(值:1)的相同数据:
预计:
00000001
次优:
10000001 10000000 10000000 10000000 00000000
非常次优:
10000001 10000000 10000000 10000000 10000000 10000000 10000000 10000000 10000000 00000000
(每个字节的MSB是continuation flag;其他7位是payload,最低位组在前;这里的varint最大大小应该是10字节,因为只需要 64 位,但我想知道是否有任何库没有明确检查这一点!)
实际上:图书馆使用第一种形式。
例如,我有下一条消息:
Message Header {
fixed32 messageType;
fixed32 messageSize;
}
我可以确定在任何平台上,在任何语言上,Header 都会被序列化为常量字节数组?
是的...大概,应该 是可预测的和固定大小的。有效负载是固定大小的,header 是 varint 编码的。这里有一个 轻微 问题是 varint 规范实际上并不禁止次优编码 - 它可以 理论上 最多包含 9 个额外的零字节仅设置连续位进行填充。但是实际上这不是问题。
因此:这些是解释为 varint(值:1)的相同数据:
预计:
00000001
次优:
10000001 10000000 10000000 10000000 00000000
非常次优:
10000001 10000000 10000000 10000000 10000000 10000000 10000000 10000000 10000000 00000000
(每个字节的MSB是continuation flag;其他7位是payload,最低位组在前;这里的varint最大大小应该是10字节,因为只需要 64 位,但我想知道是否有任何库没有明确检查这一点!)
实际上:图书馆使用第一种形式。