Protobuf не может декодировать буфер

Версия 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 файл:

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: индекс вне диапазона: 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/protobufjre/js/js)) в Type._PulseFlagSample$decode [as 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/protobufjs/src/type.js:370:7) в Type._PulseFlagData$decode [как декодировать] (eval в 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) в /home/deck/NetBeansProjects/lora/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
Другие вопросы по тегам