base64로 인코딩 된 문자열에 대한 ArrayBuffer
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가 큰 경우 일부 브라우저에서 런타임 오류가 발생할 수 있습니다. 정확한 크기 제한은 구현에 따라 다릅니다.
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"
짧게 좋아하는 사람들을 위해 Array.reduce
스택 오버플로를 발생시키지 않는 다른 사용 방법 이 있습니다.
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
나는 이것을 사용했고 나를 위해 일했다.
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;
}
My recommendation for this is to NOT use native btoa
strategies—as they don't correctly encode all ArrayBuffer
's…
rewrite the DOMs atob() and btoa()
Since DOMStrings are 16-bit-encoded strings, in most browsers calling window.btoa on a Unicode string will cause a Character Out Of Range exception if a character exceeds the range of a 8-bit ASCII-encoded character.
While I have never encountered this exact error, I have found that many of the ArrayBuffer
's I have tried to encode have encoded incorrectly.
I would either use MDN recommendation or gist.
Below are 2 simple functions for converting Uint8Array to Base64 String and back again
arrayToBase64String(a) {
return btoa(String.fromCharCode(...a));
}
base64StringToArray(s) {
let asciiString = atob(s);
return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}
You can derive a normal array from the ArrayBuffer
by using Array.prototype.slice
. Use a function like Array.prototype.map
to convert bytes in to characters and join
them together to forma string.
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
}
This method is faster since there are no string concatenations running in it.
By my side, using Chrome navigator, I had to use DataView() to read an 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("");
}
This is better, if you use JSZip for unpack archive from string
참고URL : https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
'IT' 카테고리의 다른 글
스위프트를 어레이로 설정 (0) | 2020.06.01 |
---|---|
복합 기본 키를 올바르게 작성하는 방법-MYSQL (0) | 2020.06.01 |
DIV를 포장하지 않는 방법? (0) | 2020.06.01 |
HTML을 Html.ActionLink () 안에 넣고 링크 텍스트 없음? (0) | 2020.06.01 |
PowerShell의 함수 반환 값 (0) | 2020.06.01 |