Protobuf无法解码缓冲区

时间:2016-12-20 15:44:23

标签: node.js protocol-buffers protobufjs

protobuf.js版本:^ 6.2.1

缓冲

083515604859581840220a0d6048595815bdf426422a0a0d7047595815bdf426

protobuf.load("PulseFlagData.proto", function(err, root) {
                            if (err) {
                                callback(err);
                            }
                            var pulse = root.lookup("PulseFlagData");

                            callback(null, pulse.decode(parsed_data.payload)); 
 });   

.proto file:

syntax = "proto3";

message PulseFlagSample {
    required fixed32 timestamp = 1;
    required uint32 input = 2;
    required bool flag = 3;
}

message PulseFlagData {
    required uint32 config_version = 1;
    required fixed32 device_time = 2;
    required PulseFlagSample current = 3;
    optional PulseFlagSample last_hour = 4;
}

错误:

/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/reader.js:390             throw indexOutOfRange(this,length);             ^

RangeError:index超出范围:23 + 10> 32     在RangeError(本机)     在indexOutOfRange(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/reader.js:13:12)     在BufferReader.skip(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/reader.js:390:19)     在BufferReader.ReaderPrototype.skipType(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/reader.js:410:18)     在Type._PulseFlagSample $ decode [as decode](eval eval(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/node_modules/@protobufjs/codegen/index.js:102:25),:19:7)     在Type.decode_setup [作为解码](/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/type.js:370:7)     在Type._PulseFlagData $ decode [as decode](eval eval(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/node_modules/@protobufjs/codegen/index.js:102:25),:16:27)     在Type.decode_setup [作为解码](/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/type.js:370:7)     在/home/deck/NetBeansProjects/lora/server.js:42:50     完成后(/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/root.js:84:9)

1 个答案:

答案 0 :(得分:1)

您的输入不是有效的协议缓冲区。

  1. 似乎是在消息中间切断了。最后一个顶级字段是10个字节的长度分隔字段,但消息仅在9个字节后结束。因此,至少缺少一个字节。如果应该出现其他字段,可能会丢失更多字节。
  2. 即使消息没有过早切断,它似乎与您正在解析的类型不匹配。该消息似乎包含字段:

    LinearLayout linear_layout;
     Textview textview;
     for (int i = 0; i < 3; i++) {
            textview = new TextView(this);
            textview .setId(i);
            textview .setTextSize(15);
            textview .setTextColor(Color.BLACK);
            linear_layout.add(textview);
           }
    
     linear_layout.findViewById(1).setBackgroundColor(Color.RED);
    

    这些字段声明与您提供的uint32 a = 1; fixed32 b = 2; int32 c = 3; SomeMessageType d = 4; SomeMessageType e = 5; 类型不符。

  3. 以下是按字段细分的原始数据:

    PulseFlagData