ArrayBuffer to base64 encoded string

前端 未结 12 1319
渐次进展
渐次进展 2020-11-22 07:16

I need an efficient (read native) way to convert an ArrayBuffer to a base64 string which needs to be used on a multipart post.

相关标签:
12条回答
  • 2020-11-22 07:59

    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.

    • https://github.com/beatgammit/base64-js
    • https://gist.github.com/jonleighton/958841
    0 讨论(0)
  • 2020-11-22 08:00

    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)));
    }
    
    0 讨论(0)
  • 2020-11-22 08:03
    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 );
    }
    

    but, non-native implementations are faster e.g. https://gist.github.com/958841 see http://jsperf.com/encoding-xhr-image-data/6

    0 讨论(0)
  • 2020-11-22 08:05

    There is another asynchronous way use Blob and FileReader.

    I didn't test the performance. But it is a different way of thinking.

    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"
    
    0 讨论(0)
  • 2020-11-22 08:05

    I used this and works for me.

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 08:07

    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;}
    
    0 讨论(0)
提交回复
热议问题