将base64字符串转换为ArrayBuffer的有效方法



给定一个base64字符串,创建ArrayBuffer最安全、最有效的方法是什么。特别是纯现代JavaScript中的无类型数组缓冲区。

第一个SO结果是2014年的这个问题。公认的答案是

function _base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}

它已经假设了一种类型,并且有评论表明这并不总是正确的。

这仍然是目前最好的解决方案吗?我们必须对for循环中的所有元素进行迭代吗?使用vanillaJS有没有更好、更有效的方法可以传递字符串的blob

一个示例问题是处理作为base64编码字符串提供的GLTF缓冲区:

let str = 'data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=';

这有两个单独的标量(无符号短(和vec3(浮点(数据视图,需要进一步处理。

[编辑]

因此,最流行的答案在这里没有用,因为它创建了一个TypedArray,但base64字符串中的数据并不代表同质数据集。

由于您的strdata:uri,因此您可以使用fetch:

let str = 'data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=';
fetch(str)
.then(b => b.arrayBuffer())
.then(buff => console.log( new Int8Array(buff) /* just for a view purpose */ ))
.catch(e => console.log(e))

最新更新