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

sxp*_*sxp 5 go protocol-buffers unmarshalling proto

在解组二进制 protobuf 消息时,出现以下错误“解组错误:原型:无法解析保留的线路类型”。

newMessage := &MessageName{}
err = proto.Unmarshal(data, newMessage)
Run Code Online (Sandbox Code Playgroud)

这里是我从 Protobuf 二进制文件中读取的数据,其内容类似于此处给出的二进制格式 -> protobuf 文本格式是什么样的?

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

如何修复这个错误?

dwu*_*urf 4

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

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

  0001  0111
  ^      ^
  varint wiretype
Run Code Online (Sandbox Code Playgroud)

文档中显示了有效的电线类型。您的二进制值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
Run Code Online (Sandbox Code Playgroud)

  • 我的答案是相同的,您收到的错误消息表明解析器在解析 protobuf 流时因无效数据而阻塞。该错误是从这里引发的 https://github.com/golang/protobuf/blob/b5de78c91d0d09482d65f0a96927631cd343d7bb/proto/buffer.go#L313 (2认同)