Node.js Buffer - чтение байтов - PullRequest
0 голосов
/ 18 октября 2019

вызов кода

Дано

Дан промышленный протокол со следующей операцией чтения

/ *** операция чтения из определенного количества байтов, начиная с заданной позиции

  • и выполняет предоставленный обратный вызов с полезной нагрузкой чтения

  • @ param startстартовый регистр

  • @ длина параметра количество байтов для чтения (важно: максимальная длина равна 10!)

  • @ param callback обратный вызов получаетсчитывать полезную нагрузку типа Buffer в качестве параметра * /

        industrialProtocol.read(start, length, callback)
        e.g. industrialProtocol.read(3, 1, callback) => callback(err, payload)
    

Функция чтения обеспечивает доступ к сегменту данных любого устройства с этим протоколом.

Предполагается сегмент данныхс 4096 байтами представляется следующим образом: сегмент данных 0 1 2 3 4…. 4096 байт

Реализация

Пожалуйста, реализуйте алгоритм, который считывает несколько значений с устройства и передает его соответствующим функциям обратного вызова наиболее эффективным способом. Созданная вами функция должна легко использоваться, например, в ситуации, когда выполняется регулярный опрос по интересующим регистрам. Мы считаем функцию чтения медленной и дорогой, поэтому постараемся свести к минимуму количество обращений к функции чтения и объединить несколько операций чтения в меньшее число.

/ ** * *

* @param inputList List of values to read: [{3, 2, callbackA}, {4, 1, 
    callbackB}]
    * [{start, length, callback}, ….]
    */
    yourFunction(inputList)
    Example aggregation:
    inputList = [{3, 1, cb1}, {4, 1, cb2}]
    ➔ industrialProtocol.read(3, 1, cb1) & industrialProtocol.read(4, 1, cb2)
    ➔ Aggregation: industrialProtocol.read(3, 2) ➔ cb1(payload1) & cb2(payload2)

Убедитесь, что каждый обратный вызов вызывается с правильной полезной нагрузкой.

Мое решение для агрегированного чтения:

exports.getAggregateRead = (inputList) => {
  // var inputList = [{start: 3, length: 1 }, { start: 4, length: 8}];
  var startRegisterArray = inputList.map(input => {
    return input.start;
  });

  var endRegisterArray = inputList.map(input => {
    return input.start + input.length;
  });

  var aggregrateRead = {};
  aggregrateRead.start = Math.min(...startRegisterArray);
  aggregrateRead.length = Math.max(...endRegisterArray) - aggregrateRead.start;
  return aggregrateRead;
}

Однако я не знаком с буферами Node.js и незнать, как приступить к следующим шагам. Любые выводы будут полезны.

Я уже провалил вызов кода, так что это не обман, а скорее подготовка к следующему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...