Node.js, использующий различные типы данных в байтовом массиве

1

Мне нужно создать массив байтов с относительными типами данных в нем, например: у меня будут данные, которые будут содержать байты (0-100), байт (0-10), два байта (-30- + 100), Bool ( 0/1), байт, два байта (0-300).

Клиент получит массив байтов (используя буфер) и получит данные из hax, которые создает буфер, используя смещения. Поэтому мне нужно всегда сохранять количество байтов, как в спецификациях API, которые я получаю от клиента.

Пример:

Battery.protorype.onSubscribe = function(maxValuesSize, updateValueCallback) {
    var bytes = Array(6);
    bytes[0] = 50;
    bytes[1] = 2;
    bytes[2] = -20;
    bytes[3] = true;
    bytes[4] = 32;
    bytes[5] = 290;
    updateValueCallback(new Buffer(bytes));

Вернется: 0x3202ec012022

Это, конечно, не хорошо из-за двух вещей:

  1. -20 является ec? и 290 составляет 22? (что происходит с первым байтом? 290 dec - 0x122, и это два байта)

  2. Событие, если это было правильно (если числа содержались в одном байте), мне нужно сохранить размеры для поддержания смещений, и это не поддерживает смещения, так как все числа здесь имеют размер одного байта.

Кто-нибудь знает, как решить эту проблему?

Теги:

2 ответа

2
Лучший ответ

Вы должны сделать лечение самостоятельно, я бы использовал индивидуальный класс. Подобно:

// Use of an array, where you gonna hold the data using describing structure
this.array = [];

// Store values along with the size in Byte
push(value, size) {
  this.array.push({
    size,
    value,
  });
}

// Turn the array into a byte array
getByteArray() {
  // Create a byte array
  return this.array.reduce((tmp, {
    size,
    value,
  }) => {
    // Here you makes multiple insertion in Buffer depending on the size you have

    // For example if you have the value 0 with a size of 4.
    // You make 4 push on the buffer
    tmp.push(...);

    return tmp;
  }, new Buffer());
}

EDIT: больше объяснений

Вы должны создать класс, который будет обрабатывать хранение и обработку данных.

Когда мы имеем дело с данными, мы храним его связанным с ним размером в байте.

например, число 12 в 3 байт, мы будем хранить { value: 12, size: 3 }.

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

например, число 12 в 3 байт.

Мы будем хранить в буфере 0, 0 и 12.


Чтобы быть ясным:

ДО

array.push(12);

new Buffer(array);

Буфер читает массив, принимает 12 и преобразует его в байты, поэтому 0x0C

Вы Buffer = [ 0x0C ]


СЕЙЧАС

array.push({ value: 12, size: 3 });

array.reduce( ...

 // Because we have a size of 3 byte, we push 3 Byte in the buffer

 buffer.push(0);
 buffer.push(0);
 buffer.push(12);

..., new Buffer());

Вы Buffer = [ 0x00, 0x00, 0x0C ]

  • 0
    Можете ли вы объяснить немного больше об этом, поскольку это не может заставить его работать ... 10x
  • 0
    @Erez Я сделал правку
Показать ещё 4 комментария
0

Два байта (-30 - + 100)//Нет значения этого значения. -30 является es в 8-битном значении с двумя дополнениями, поэтому его можно сохранить в 1 байт.

Два байта (0 -30 0)//могут храниться в 2 байтах. Преобразование числа в биты для exp. используя (300).toString(2) и сохраняйте в 2 байта.

  • 0
    Я знаю, но, как я уже сказал, клиент решает спецификации для смещений, и они решили, что это должно быть 2 байта по их собственным причинам ... 10x
  • 0
    поэтому выделите 2 байта для каждого значения, создайте / скомпонуйте буфер и отправьте клиенту, и в конечном итоге он проанализирует значения, используя смещение 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню