Перевести массив битов в байты и число с плавающей запятой - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь прочитать плавающие числа (плавающие 32 бита каждое) из массива (который содержит только биты). В то время как я пытаюсь сделать это с ArrayBuffer и DataView, в конце я получил странные значения.Я ожидаю получить обратно 2 плавающих числа, но я вижу, что все числа равны 0.

Чего мне здесь не хватает?Я ожидаю 2 float (firsNum, secNum) каждый из 4 байтов по порядку

// Simple array contain 8 bytes
var myBitsArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0];

// Array buffer with size of 8 bytes
const buffer = new ArrayBuffer(8);

// Loop all the data to the array buffer add 8 bits at each time
for (var i = 0; i < myBitsArr.length / 8; i++) {
  var byteCounter = i * 8;
  var b_0 = myBitsArr[byteCounter + 0] << 0;
  var b_1 = myBitsArr[byteCounter + 1] << 1;
  var b_2 = myBitsArr[byteCounter + 2] << 2;
  var b_3 = myBitsArr[byteCounter + 3] << 3;
  var b_4 = myBitsArr[byteCounter + 4] << 4;
  var b_5 = myBitsArr[byteCounter + 5] << 5;
  var b_6 = myBitsArr[byteCounter + 6] << 6;
  var b_7 = myBitsArr[byteCounter + 7] << 7;

  buffer[i] = (b_0 + b_1 + b_2 + b_3 + b_4 + b_5 + b_6 + b_7);
}

console.log(buffer)

// View the floating numbers
var viewNumbers = new DataView(buffer);
var firsNum = viewNumbers.getFloat32(0); // get 0 back and not float number
var secNum = viewNumbers.getFloat32(1); // get 0 back and not float number
console.log(firsNum, secNum)

1 Ответ

2 голосов
/ 29 апреля 2019

Помимо замечаний: ArrayBuffer не является массивом, поэтому buffer[i] не делает ничего полезного.Вам нужен типизированный массив, скорее всего, Uint8Array, называемый uint8 ниже:

// Simple array contain 8 bytes
var myBitsArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0];

// Array buffer with size of 8 bytes
const buffer = new ArrayBuffer(8);
const uint8 = new Uint8Array(buffer);

// Loop all the data to the array buffer add 8 bits at each time
for (var i = 0; i < myBitsArr.length / 8; i++) {
  var byteCounter = i * 8;
  var b_0 = myBitsArr[byteCounter + 0] << 0;
  var b_1 = myBitsArr[byteCounter + 1] << 1;
  var b_2 = myBitsArr[byteCounter + 2] << 2;
  var b_3 = myBitsArr[byteCounter + 3] << 3;
  var b_4 = myBitsArr[byteCounter + 4] << 4;
  var b_5 = myBitsArr[byteCounter + 5] << 5;
  var b_6 = myBitsArr[byteCounter + 6] << 6;
  var b_7 = myBitsArr[byteCounter + 7] << 7;

  uint8[i] = (b_0 + b_1 + b_2 + b_3 + b_4 + b_5 + b_6 + b_7);
}

console.log(buffer)

// View the floating numbers
var viewNumbers = new DataView(buffer);
var firsNum = viewNumbers.getFloat32(0,true); // get 0 back and not float number
var secNum = viewNumbers.getFloat32(4,true); // get 0 back and not float number
console.log(firsNum, secNum);

Затем он делает что-то , отображает "4.600743118071239e-41 4.027191656623092e-41" без true -s (большой порядок байтов) и«4 240» на данный момент (порядковый номер, который все еще может быть неправильным).С перевернутым порядком битов он производит странные числа в целом, но одно созвездие получает -35,5 для второго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...