【问题标题】:Convert uint8array to double in javascript在javascript中将uint8array转换为double
【发布时间】:2018-02-19 12:58:00
【问题描述】:

我有一个数组缓冲区,我想获得双精度值。例如从 [64, -124, 12, 0, 0, 0, 0, 0] 我会得到 641.5

有什么想法吗?

【问题讨论】:

  • 向我们展示您的尝试以及您的逻辑?
  • 我有一个函数可以返回带有音频文件字节的数组缓冲区: function getBuffer(resolve) { var reader = new FileReader(); reader.readAsArrayBuffer(fileData); reader.onload = function () { var arrayBuffer = reader.result var bytes = new Uint8Array(arrayBuffer);解决(字节); } }
  • 我需要双精度值而不是 0 到 255 的字节数

标签: javascript arrays double uint8array


【解决方案1】:

您可以改编 T.J. Crowder 的优秀 answer 并将 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);

【讨论】:

  • 看起来不错。但是如果我有更长的数组怎么办。例如:var data = [64, -124, 12, 0, 0, 0, 0, 0,64, -124, 12, 0, 0, 0, 0, 0];那么结果将是:[641.5,641.5]
  • 太棒了!非常感谢
【解决方案2】:

根据 Nina Scholz 的回答,我想出了一个更短的:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2021-08-30
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2022-11-22
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多