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.

26voto

L'OP n'a pas spécifié l'environnement d'exécution, mais si vous utilisez Node.JS, il y a un moyen très simple de faire cela.

Conformément à la documentation officielle de 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');

De plus, si vous utilisez Angular par exemple, la classe Buffer sera également disponible dans un environnement de navigateur.

20voto

Elias Vargas Points 384

Je l'ai utilisé et il me convient parfaitement.

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;
}

18voto

chemoish Points 257

Je recommande de ne pas utiliser le système natif btoa car elles n'encodent pas correctement toutes les ArrayBuffer 's

[réécrire les DOM atob() et btoa()](https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_rewrite_the_DOMs_atob()_and_btoa()_using_JavaScript's_TypedArrays_and_UTF-8)

Puisque les DOMStrings sont des chaînes encodées sur 16 bits, dans la plupart des navigateurs, appeler window.btoa sur une chaîne Unicode provoquera une exception Character Out Of Range si un caractère dépasse la plage d'un caractère encodé sur 8 bits par l'ASCII.

Bien que je n'aie jamais rencontré cette erreur exacte, j'ai constaté que bon nombre des ArrayBuffer que j'ai essayé d'encoder l'ont été de manière incorrecte.

J'utiliserais la recommandation MDN ou gist.

15voto

Steve Dixon Points 171

Voici deux fonctions simples permettant de convertir un tableau Uint8 en chaîne Base64 et vice-versa

arrayToBase64String(a) {
    return btoa(String.fromCharCode(...a));
}

base64StringToArray(s) {
    let asciiString = atob(s);
    return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}

5voto

Hendy Irawan Points 4635

Si vous êtes d'accord pour ajouter une bibliothèque, base64-arraybuffer :

yarn add base64-arraybuffer

ensuite :

  • encode(buffer) - Encode le tampon ArrayBuffer en chaîne base64
  • decode(str) - Décode la chaîne base64 en ArrayBuffer

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