2016-12-20 2 views
1

protobuf.js версии:^6.2.1Protobuf Невозможно декодировать буфер

буфер

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 файл:

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 бросок indexOutOfRange (это, длина); ^

RangeError: индекс вне диапазона: 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) at Type._PulseFlagSample $ decode [в качестве декодирования] (eval at eof (/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/pr otobufjs/src/type.js: 370: 7) at Type._PulseFlagData $ decode [в качестве декодирования] (eval at eof (/ 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) at/home/палубные/NetBeansProjects/лора/server.js: 42: 50 на финише (/home/deck/NetBeansProjects/lora/node_modules/protobufjs/src/root.js:84:9)

ответ

1

Ваш вклад не является действительным буфер протокола.

  1. похоже, что оно отключено в середине сообщения. Последнее поле верхнего уровня представляет собой поле с разделителями по длине в 10 байт, но сообщение заканчивается только после 9 байтов. Следовательно, по крайней мере один байт отсутствует. Может отсутствовать больше байтов, если должны появиться дополнительные поля.
  2. Даже если сообщение не было прервано преждевременно, оно не соответствует типу, который вы обрабатываете как. Появится сообщение, чтобы иметь поля:

    uint32 a = 1; 
    fixed32 b = 2; 
    int32 c = 3; 
    SomeMessageType d = 4; 
    SomeMessageType e = 5; 
    

    Эти заявления поля не совпадают с типом PulseFlagData вы дали.

Вот исходные данные с разбивкой по областям:

08 35      // 1: [u]int32, = 53 
15 60485958     // 2: fixed32, = 1615354200 
18 40      // 3: [u]int32, = 64 
22 0a 0d6048595815bdf42642 // 4: sub-message, length 10 
    0d 60485958    // 1: fixed32, = 1615354200 
    15 bdf42642    // 2: fixed32, = 3186894402 
2a 0a 0d7047595815bdf426 // 5: sub-message, length 10, incomplete 
    0d 70475958    // 1: fixed32, = 1883724120 
    15 bdf426     // 2: fixed32, incomplete 
+0

ты прав! Я потерял последний байт. и получил неверное описание данных от поставщика. Спасибо! – levide