Мне нужно создать массив байтов с относительными типами данных в нем, например: у меня будут данные, которые будут содержать байты (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
Это, конечно, не хорошо из-за двух вещей:
-20 является ec? и 290 составляет 22? (что происходит с первым байтом? 290 dec - 0x122, и это два байта)
Событие, если это было правильно (если числа содержались в одном байте), мне нужно сохранить размеры для поддержания смещений, и это не поддерживает смещения, так как все числа здесь имеют размер одного байта.
Кто-нибудь знает, как решить эту проблему?
Вы должны сделать лечение самостоятельно, я бы использовал индивидуальный класс. Подобно:
// 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 ]
Два байта (-30 - + 100)//Нет значения этого значения. -30 является es в 8-битном значении с двумя дополнениями, поэтому его можно сохранить в 1 байт.
Два байта (0 -30 0)//могут храниться в 2 байтах. Преобразование числа в биты для exp. используя (300).toString(2) и сохраняйте в 2 байта.