Конвертировать uint8array в double в javascript

1

У меня есть arraybuffer, и я хочу получить двойные значения. Например, из [64, -124, 12, 0, 0, 0, 0, 0] я бы получил 641,5

Есть идеи?

  • 0
    покажи нам, что ты пробовал и в чем твоя логика?
  • 0
    У меня есть функция, которая возвращает массив буферов с байтами из аудиофайла: function getBuffer (resol) {var reader = new FileReader (); reader.readAsArrayBuffer (FileData); reader.onload = function () {var arrayBuffer = reader.result var bytes = new Uint8Array (arrayBuffer); разрешения (байт); }}
Показать ещё 1 комментарий
Теги:
arrays
double
uint8array

2 ответа

1
Лучший ответ

Вы можете адаптировать отличный ответ TJ Crowder и использовать DataView#setUint8 для заданных байтов.

var data =  [64, -124, 12, 0, 0, 0, 0, 0];

// Create a buffer
var buf = new ArrayBuffer(8);
// Create a data view of it
var view = new DataView(buf);

// set bytes
data.forEach(function (b, i) {
    view.setUint8(i, b);
});

// Read the bits as a float/native 64-bit double
var num = view.getFloat64(0);
// Done
console.log(num);

Для нескольких номеров вы можете взять куски 8.

function getFloat(array) {
    var view = new DataView(new ArrayBuffer(8));
    array.forEach(function (b, i) {
        view.setUint8(i, b);
    });
    return view.getFloat64(0);
}

var data =  [64, -124, 12, 0, 0, 0, 0, 0, 64, -124, 12, 0, 0, 0, 0, 0],
    i = 0,
    result = [];

while (i < data.length) {
    result.push(getFloat(data.slice(i, i + 8)));
    i += 8;
}

console.log(result);
  • 0
    это выглядит хорошо. Но что, если у меня есть более длинный массив. Например: var data = [64, -124, 12, 0, 0, 0, 0, 0,64, -124, 12, 0, 0, 0, 0, 0]; Тогда результат будет: [641,5,641,5]
  • 0
    @ user7597554, см. редактирование.
Показать ещё 1 комментарий
0

На основании ответа от Нины Шольц я придумал более короткое:

function getFloat(data /* Uint8Array */) {
  return new DataView(data.buffer).getFloat64(0);
}

Или, если у вас большой массив и вы знаете смещение:

function getFloat(data, offset = 0) {
  return new DataView(data.buffer, offset, 8).getFloat64(0);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню