답변:
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의 문자에 안전합니다 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
.
DOM atob () 및 btoa ()를 다시 작성하십시오.
DOMString은 16 비트 인코딩 된 문자열이므로 유니 코드 문자열에서 window.btoa를 호출하는 대부분의 브라우저에서 문자가 8 비트 ASCII 인코딩 문자의 범위를 초과하면 범위를 벗어난 문자 예외가 발생합니다.
이 정확한 오류가 발생하지는 않았지만 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);
다음은 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는 Running Enviroment를 지정하지 않았지만 Node.JS를 사용하는 경우 매우 간단한 방법이 있습니다.
공식 Node.JS 문서와 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에서 실행중인 경우 버퍼 환경은 브라우저 환경에서도 사용할 수 있습니다.
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을 사용하는 것이 좋습니다