Node.js使用字节数组

时间:2017-09-12 08:48:38

标签: javascript node.js node.js-buffer

我需要在其中创建一个带有不同数据类型的字节数组,例如:我将拥有包含字节(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

这当然不好因为两件事:

  1. -20是ec?而290是22? (第一个字节发生了什么?290 dec是0x122,这是两个字节)

  2. 如果这是正确的事件(如果数字包含在一个字节中),我需要保持大小以保持偏移量,这不会保持偏移量,因为这里的所有数字都是一个字节的大小

  3. 有人知道如何解决这个问题吗?

2 个答案:

答案 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

我们将存储在缓冲区0012中。

要明确:

<强> 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个字节。