无法找到 Protobuf Unmarshal 错误的解决方案

Cannot Find Solutions to a Protobuf Unmarshal Error

我在解组二进制 protobuf 消息时收到以下错误 "unmarshaling error: proto: cannot parse reserved wire type"。

newMessage := &MessageName{}
err = proto.Unmarshal(data, newMessage)

这是我从 Protobuf 二进制文件中读取的数据,其内容类似于此处给出的二进制格式 -> What does the protobuf text format look like?

读取文件并存储到数据后,数据看起来像这样 [23 67 102 56 ... ]

如何解决这个错误?

[23 67 102 56 ... ] 看起来像一片整数,我假设整数是字节值。如果这是真的,这不是 protobuf 流!

查看 protobuf docs,第一个字节始终是 varint 键。这由字段编号(前 5 位)和线类型(后 3 位)组成。你的 23 整数看起来像这样:

  0001  0111
  ^      ^
  varint wiretype

文档中显示了有效的电线类型。您的二进制值 111 是十进制值 7,这不是列出的类型之一。因此:cannot parse reserved wire type

Type    Meaning             Used For
0       Varint              int32, int64, uint32, uint64, sint32, sint64, bool, enum
1       64-bit              fixed64, sfixed64, double
2       Length-delimited    string, bytes, embedded messages, packed repeated fields
3       Start group         groups (deprecated)
4       End group           groups (deprecated)
5       32-bit              fixed32, sfixed32, float