ProtobufJS поле повторяющихся байтов не правильно кодирует Uint8Array - PullRequest
0 голосов
/ 06 июля 2018

У меня есть сообщение protobuf, определенное как:

message examplemessage
{
    string field1 = 1;
    string field2 = 2;
    repeated bytes field3 = 3;
}

Я загружаю свой протобуф с помощью:

protobuf.load(path).then(root => {
    // global for example
    examplemessage = root.lookupType("test.examplemessage");
    resolve(); 
});

Я создаю объект сообщения protobuf с

let createdMessage = examplemessage.create({
    field1: "test1",
    field2: "test2",
    field3: new Uint8Array([0,0,0,33])
});

Я тогда закодирую его

let encoded = examplemessage.encode(createdMessage).finish();

Я тогда декодирую и ожидаю

{
    field1: "test1",
    field2: "test2",
    field3: Uint8Array(4) [0, 0, 0, 33]
}

Вместо этого я вижу

{
    field1: "test1",
    field2: "test2",
    [Uint8Array(0), Uint8Array(0), Uint8Array(0), Uint8Array(0)]
}

Затем я изменил свою загрузку protobuf на JSON

const root = protobuf.Root.fromJSON(json);

Работает, как и ожидалось, без других изменений.

Я что-то не так делаю или это ошибка?

Спасибо

Protoubuf Версия: 6.8.6

Браузер: Chrome

Пример JSFiddle с рабочей загрузкой JSON: https://jsfiddle.net/740snmu6/12/

1 Ответ

0 голосов
/ 28 ноября 2018

repeated bytes означает Array из байтов (как вы, возможно, уже знаете, соответствующий тип байтов Uint8Array или Array в JavaScript), поэтому, чтобы он работал, вы должны создать сообщение следующим образом:

{
    field1: "test1",
    field2: "test2",
    field3: [new Uint8Array([0, 0, 0, 33]), new Uint8Array([0, 0, 0, 33]), new Uint8Array([0, 0, 0, 33])]
}
...