Javascript-打开位

时间:2019-07-31 11:07:11

标签: javascript node.js bit-manipulation buffer

我对位和字节,移位概念等有所了解-但没有实际经验。

所以:
我需要将对错数组转换为一个缓冲区,该缓冲区由1344位(我使用UDP数据包发送)组成。

另一端将逐点评估缓冲区。

由于我是nodeJ的新手,请随时添加提示或为我指明新的方向。

var arrBinary = new Array(1344);
for(i=0;i<1344;i++)arrBinary[i]=0;    
// some code here, which will turn some of the array's elements to 1

var arrForBuffer = new Array(168);
for(i=0;i<168;i++)arrForBuffer[i]=0;

var x = buffer.from(arr);

/****** the question ******/
// How to change and set arrForBuffer so it will represent the arrBinary Bits state?

2 个答案:

答案 0 :(得分:2)

您可以按照您所说的进行一些移位:

// arrForBuffer must be initialized with 0s

for(let i = 0; i < 1344; i++) 
 arrForBuffer[ Math.floor(i / 8) ] += arrBinary[i] << (7 - (i % 8));

例如arrBinary的第一位将左移7并添加到第一个字节,第二位将左移6,依此类推。第八位将再次左移7位,并将其添加到第二个字节中。

如果将其编写为:

,它可能更具可读性(并且可能更具性能)。

 for(let byte = 0; byte < 168; byte++) {
   arrForBuffer[byte] = 
     arrBinary[byte * 8 + 0] << 7 |
     arrBinary[byte * 8 + 1] << 6 |
     arrBinary[byte * 8 + 2] << 5 |
     arrBinary[byte * 8 + 3] << 4 |
     arrBinary[byte * 8 + 4] << 3 |
     arrBinary[byte * 8 + 5] << 2 |
     arrBinary[byte * 8 + 6] << 1 |
     arrBinary[byte * 8 + 7];
 } 

答案 1 :(得分:1)

JavaScript支持像每种主要语言中一样的位操作。您可以使用|<<运算符来实现此转换:

const size = 16;
const packsize = 8;

const arrBinary = new Array(size).fill(false);
arrBinary[2] = true;
arrBinary[6] = true;
arrBinary[8] = true;

let arrForBuffer = new Array(size / packsize);

let acc = 0;
let byteCounter = 0;

for (let i = 0; i < arrBinary.length; i++) {
  if (arrBinary[i]) {
    acc |= 1 << (i % packsize);
  }

  if (i % packsize == packsize - 1) {
    arrForBuffer[byteCounter] = acc;
    byteCounter++;
    acc = 0;
  }
}

for (let i = 0; i < arrForBuffer.length; i++) {
  console.log(`${i}: ${arrForBuffer[i]}`);
}