312 votes

ArrayBuffer vers une chaîne encodée en base64

J'ai besoin d'une méthode efficace (native) pour convertir un fichier ArrayBuffer à une chaîne de caractères base64 qui doit être utilisée dans un message multipartite.

1voto

Ali Points 1597
ABtoB64(ab) {
    return new Promise(res => {
        const fr = new FileReader();
        fr.onload = ({target: {result: s}}) => res(s.slice(s.indexOf(';base64,') + 8));
        fr.readAsDataURL(new Blob([ab]));
    });
}

méthode asynchrone utilisant un lecteur de fichiers.

0voto

Charlie H Points 2538

Vous pouvez dériver un tableau normal à partir du tableau ArrayBuffer en utilisant Array.prototype.slice . Utilisez une fonction comme Array.prototype.map pour convertir les octets en caractères et join pour former une chaîne de caractères.

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

}

Cette méthode est plus rapide car elle ne comporte pas de concaténation de chaînes de caractères.

-1voto

user14612834 Points 9

Utilice uint8-to-b64 pour faire de l'encodage/décodage dans le navigateur et Node.js

-4voto

Louvet Jean Points 1

De mon côté, en utilisant le navigateur Chrome, j'ai dû utiliser DataView() pour lire un 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;}

-6voto

RouR Points 1255
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("");
}

C'est mieux si vous utilisez JSZip pour décompresser l'archive à partir d'une chaîne de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X