Невозможно найти решения для ошибки Unmarshal Protobuf - PullRequest
1 голос
/ 27 мая 2020

Я получаю следующую ошибку «ошибка демаршалинга: proto: не удается проанализировать зарезервированный тип провода» при демаршалинге двоичного сообщения protobuf.

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

Здесь для данных, которые я читаю из двоичного файла Protobuf, содержимое которого выглядит примерно как двоичный формат, указанный здесь -> Как выглядит текстовый формат protobuf?

После чтения файла и сохранения в данных данные выглядят примерно так [23 67 102 56 ...]

Как исправить эту ошибку?

1 Ответ

2 голосов
/ 27 мая 2020

[23 67 102 56 ... ] выглядит как кусок целых чисел, я предполагаю, что целые числа - это байтовые значения. Если это правда, это не поток protobuf!

Глядя на protobuf docs , первый байт всегда является ключом varint. Он состоит из номера поля (первые 5 бит) и типа провода (последние 3 бита). Ваш int 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
...