[javascript] base64로 인코딩 된 문자열에 대한 ArrayBuffer

ArrayBuffermultipart 게시물에서 사용해야하는 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);