我需要在其中创建一个带有不同数据类型的字节数组,例如:我将拥有包含字节(0-100),字节(0-10),两个字节(-30- + 100)的数据,Bool(0/1),字节,两个字节(0-300)。
客户端将接收字节数组(使用Buffer),并将使用偏移量从缓冲区创建的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,这是两个字节)
如果这是正确的事件(如果数字包含在一个字节中),我需要保持大小以保持偏移量,这不会保持偏移量,因为这里的所有数字都是一个字节的大小
有人知道如何解决这个问题吗?
答案 0 :(得分: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());
}
编辑:更多解释
您必须创建一个处理数据存储和处理的类。
当我们处理数据时,我们将其与字节大小相关联存储在字节中。
例如12
字节中的3
号码,我们将存储{ value: 12, size: 3 }
。
当我们必须生成Byte数组时,我们将使用我们存储的大小来将正确数量的Byte推入Buffer
数组。
例如12
字节中的数字3
。
我们将存储在缓冲区0
,0
和12
中。
要明确:
<强> BEFORE 强>
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 ]
答案 1 :(得分:0)
两个字节(-30- + 100)//此值没有问题。 -30是8位二进制补码有符号整数,因此可以存储在1个字节中。
两个字节(0-300)//可以以2个字节存储。将数字转换为exp的位数。使用(300).toString(2)并存储为2个字节。