Answers:
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
join()
在Firefox,IE和Safari上构建字符数组并在结尾处输入它们明显更快(但在Chrome上却慢得多):jsperf.com/tobase64-implementations
Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
这对我来说很好:
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
在ES6中,语法更加简单:
let base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
正如评论中指出的那样,当ArrayBuffer
较大时,此方法可能会导致某些浏览器出现运行时错误。确切的大小限制在任何情况下都取决于实现。
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
对于代码范围为0-255的字符是安全的,因为这里就是这种情况(想想8 in Uint8Array
)。
对于那些喜欢它的人来说,这是另一种Array.reduce
不会引起堆栈溢出的用法:
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
<amount of Bytes in the buffer>
新的字符串。
btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
样
还有另一种异步方式使用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"
dataurl.split(',', 2)[1]
代替dataurl.substr(dataurl.indexOf(',')+1)
。
readAsDataURL
,理论上可以返回百分比编码的dataURI(而且似乎在jsdom中实际上是这种情况)
split
比substring
呢?
我用这个为我工作。
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 );
}
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;
}
我的建议是不要使用本机btoa
策略,因为它们不能正确编码所有ArrayBuffer
的……
由于DOMString是16位编码的字符串,因此在大多数浏览器中,如果一个字符超出8位ASCII编码字符的范围,则在Unicode字符串上调用window.btoa会导致“字符超出范围”异常。
尽管我从未遇到过这个确切的错误,但我发现ArrayBuffer
我尝试编码的许多编码都不正确。
我会使用MDN建议或要点。
btoa
不适用于String,但OP正在询问ArrayBuffer
。
var blob = new Blob([arrayBuffer])
var reader = new FileReader();
reader.onload = function(event){
var base64 = event.target.result
};
reader.readAsDataURL(blob);
以下是2个简单的函数,用于将Uint8Array转换为Base64 String并再次返回
arrayToBase64String(a) {
return btoa(String.fromCharCode(...a));
}
base64StringToArray(s) {
let asciiString = atob(s);
return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}
function
关键字,它应该在现代浏览器中有效。
您可以ArrayBuffer
使用从派生普通数组Array.prototype.slice
。使用类似Array.prototype.map
将字节转换为字符并将join
它们一起转换为格式字符串的函数。
function arrayBufferToBase64(ab){
var dView = new Uint8Array(ab); //Get a byte view
var arr = Array.prototype.slice.call(dView); //Create a normal array
var arr1 = arr.map(function(item){
return String.fromCharCode(item); //Convert
});
return window.btoa(arr1.join('')); //Form a string
}
此方法速度更快,因为其中没有运行字符串连接。
OP没有指定运行环境,但是如果您使用的是Node.JS,则有一种非常简单的方法来执行此操作。
与官方Node.JS文档一起进行Accordig https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
// This step is only necessary if you don't already have a Buffer Object
const buffer = Buffer.from(yourArrayBuffer);
const base64String = buffer.toString('base64');
另外,例如,如果您在Angular下运行,则Buffer Class也将在浏览器环境中可用。
Javascript
。因此,我更新了答案以使其更加简洁。我认为这是一个重要的答案,因为我一直在寻找如何执行此操作的方法,而无法找到解决问题的最佳方法。
在我身边,使用Chrome导航器,我不得不使用DataView()来读取arrayBuffer
function _arrayBufferToBase64( tabU8A ) {
var binary = '';
let lecteur_de_donnees = new DataView(tabU8A);
var len = lecteur_de_donnees.byteLength;
var chaine = '';
var pos1;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( lecteur_de_donnees.getUint8( i ) );
}
chaine = window.btoa( binary )
return chaine;}
function _arrayBufferToBase64(uarr) {
var strings = [], chunksize = 0xffff;
var len = uarr.length;
for (var i = 0; i * chunksize < len; i++){
strings.push(String.fromCharCode.apply(null, uarr.subarray(i * chunksize, (i + 1) * chunksize)));
}
return strings.join("");
}
如果您使用JSZip从字符串解压缩归档文件,则更好