ArrayBuffer
multipart 게시물에서 사용해야하는 base64 문자열 로 변환하는 효율적인 (원시 읽기) 방법 이 필요합니다.
답변
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에서 구문은 조금 더 간단합니다.
let 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"
답변
나는 이것을 사용했고 나를 위해 일했다.
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
.
DOM atob () 및 btoa ()를 다시 작성하십시오.
DOMString은 16 비트 인코딩 된 문자열이므로 유니 코드 문자열에서 window.btoa를 호출하는 대부분의 브라우저에서 문자가 8 비트 ASCII 인코딩 문자의 범위를 초과하면 범위를 벗어난 문자 예외가 발생합니다.
이 정확한 오류가 발생하지는 않았지만 ArrayBuffer
인코딩하려고 시도한의 잘못 인코딩 된 .
MDN 권장 사항 또는 요지를 사용합니다.
답변
var blob = new Blob([arrayBuffer])
var reader = new FileReader();
reader.onload = function(event){
var base64 = event.target.result
};
reader.readAsDataURL(blob);