将 base64 字符串转换为 ArrayBuffer 的有效方法
Efficient way to convert base64 string to ArrayBuffer
给定一个 base64
字符串,创建 ArrayBuffer
的最安全、最有效的方法是什么。特别是纯现代 JavaScript.
中的无类型数组缓冲区
第一个 SO 结果是 this question from 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 循环中的所有元素?有没有更好更有效的方法使用 vanilla JS 我们可以传递字符串的 blob
?
一个示例问题是处理作为 base64
编码字符串提供的 GLTF buffer:
let str = 'data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=';
这有标量(unsigned short)和 vec3
(浮点)数据的两个独立视图,需要进一步处理。
[编辑]
所以最流行的答案在这里没有用,因为它创建了一个 TypedArray
但 base64
字符串中的数据并不代表同质数据集。
由于您的 str
是 data: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))
给定一个 base64
字符串,创建 ArrayBuffer
的最安全、最有效的方法是什么。特别是纯现代 JavaScript.
第一个 SO 结果是 this question from 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 循环中的所有元素?有没有更好更有效的方法使用 vanilla JS 我们可以传递字符串的 blob
?
一个示例问题是处理作为 base64
编码字符串提供的 GLTF buffer:
let str = 'data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=';
这有标量(unsigned short)和 vec3
(浮点)数据的两个独立视图,需要进一步处理。
[编辑]
所以最流行的答案在这里没有用,因为它创建了一个 TypedArray
但 base64
字符串中的数据并不代表同质数据集。
由于您的 str
是 data: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))