我需要一种有效的(读取本机)方式将 an 转换ArrayBuffer
为需要在多部分帖子中使用的 base64 字符串。
ArrayBuffer 到 base64 编码的字符串
IT技术
javascript
encoding
base64
arraybuffer
2021-01-10 17:48:37
6个回答
function _arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
但是,非本地实现更快,例如https://gist.github.com/958841 参见http://jsperf.com/encoding-xhr-image-data/6
这对我来说很好用:
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
在 ES6 中,语法稍微简单一点:
const base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
正如评论中所指出的,当ArrayBuffer
较大时,此方法可能会导致某些浏览器中的运行时错误。在任何情况下,确切的大小限制都取决于实现。
对于那些喜欢简短的人,这是另一个Array.reduce
不会导致堆栈溢出的使用:
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
还有另一种异步方式使用 Blob 和 FileReader。
我没有测试性能。但这是一种不同的思维方式。
function arrayBufferToBase64( buffer, callback ) {
var blob = new Blob([buffer],{type:'application/octet-binary'});
var reader = new FileReader();
reader.onload = function(evt){
var dataurl = evt.target.result;
callback(dataurl.substr(dataurl.indexOf(',')+1));
};
reader.readAsDataURL(blob);
}
//example:
var buf = new Uint8Array([11,22,33]);
arrayBufferToBase64(buf, console.log.bind(console)); //"CxYh"
var blob = new Blob([arrayBuffer])
var reader = new FileReader();
reader.onload = function(event){
var base64 = event.target.result
};
reader.readAsDataURL(blob);