在JavaScript中将uint8array转换为double

3

我有一个ArrayBuffer,想要获取双精度浮点数。例如从[64,-124,12,0,0,0,0,0]中获取641.5。

有什么想法吗?


展示一下你尝试过的内容以及你的逻辑是什么? - Edwin
我有一个函数,它返回包含音频文件字节的数组缓冲区: function getBuffer(resolve) { var reader = new FileReader(); reader.readAsArrayBuffer(fileData); reader.onload = function () { var arrayBuffer = reader.result var bytes = new Uint8Array(arrayBuffer); resolve(bytes); } } - user7597554
我需要的不是从0到255的字节,而是双精度值。 - user7597554
2个回答

5

您可以参考T.J. 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);


那看起来不错。但是如果我有一个更长的数组怎么办?例如:var data = [64,-124,12,0,0,0,0,0,64,-124,12,0,0,0,0,0];那么结果将会是:[641.5,641.5] - user7597554
太好了!非常感谢。 - user7597554

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接