ProtobufJS重复字节字段未正确编码Uint8Array

时间:2018-07-06 14:02:17

标签: javascript protobuf.js protobufjs

我有一条protobuf消息,定义为:

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

我在protobuf上加载:

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

可正常加载JSON的JSFiddle示例:https://jsfiddle.net/740snmu6/12/

1 个答案:

答案 0 :(得分:0)

repeated bytes表示{strong> bytes Array(您可能已经知道,相应类型的 bytes < / em> 在JavaScript中是Uint8ArrayArray),因此,要使其正常工作,您应该采用以下方式创建消息:

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