Convertir cadena base64 a ArrayBuffer

Resuelto Tony asked hace 10 años • 11 respuestas

Necesito convertir una cadena de codificación base64 en un ArrayBuffer. Las cadenas base64 son entradas del usuario, se copiarán y pegarán desde un correo electrónico, por lo que no estarán allí cuando se cargue la página. Me gustaría hacer esto en javascript sin realizar una llamada ajax al servidor, si es posible.

Esos enlaces me parecieron interesantes, pero no me ayudaron:

ArrayBuffer a cadena codificada en base64

Se trata de la conversión opuesta, de ArrayBuffer a base64, no al revés.

http://jsperf.com/json-vs-base64/2

Esto se ve bien pero no sé cómo usar el código.

¿Existe una manera fácil (tal vez nativa) de realizar la conversión? gracias

Tony avatar Feb 15 '14 19:02 Tony
Aceptado
function base64ToArrayBuffer(base64) {
    var binaryString = atob(base64);
    var bytes = new Uint8Array(binaryString.length);
    for (var i = 0; i < binaryString.length; i++) {
        bytes[i] = binaryString.charCodeAt(i);
    }
    return bytes.buffer;
}
Goran.it avatar Feb 15 '2014 12:02 Goran.it

Usando TypedArray.from :

Uint8Array.from(atob(base64_string), c => c.charCodeAt(0))

Rendimiento a comparar con la versión de bucle for de la respuesta de Goran.it.

ofavre avatar Dec 12 '2016 17:12 ofavre

Para usuarios de Node.js:

const myBuffer = Buffer.from(someBase64String, 'base64');

myBuffer será de tipo Buffer, que es una subclase de Uint8Array. Desafortunadamente, Uint8Array NO es un ArrayBuffer como pedía el OP. Pero cuando manipulo un ArrayBuffer casi siempre lo envuelvo con Uint8Array o algo similar, por lo que debería estar cerca de lo que se solicita.

DoomGoober avatar Apr 09 '2020 22:04 DoomGoober

La respuesta de Goran.it no funciona debido a un problema de Unicode en javascript: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding .

Terminé usando la función dada en el blog de Daniel Guerrero: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/

La función aparece en el enlace de github: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js

Utilice estas líneas

var uintArray = Base64Binary.decode(base64_string);  
var byteArray = Base64Binary.decodeArrayBuffer(base64_string); 
Yaan avatar Apr 02 '2016 21:04 Yaan

Solución asíncrona , es mejor cuando los datos son grandes:

// base64 to buffer
function base64ToBufferAsync(base64) {
  var dataUrl = "data:application/octet-binary;base64," + base64;

  fetch(dataUrl)
    .then(res => res.arrayBuffer())
    .then(buffer => {
      console.log("base64 to buffer: " + new Uint8Array(buffer));
    })
}

// buffer to base64
function bufferToBase64Async( buffer ) {
    var blob = new Blob([buffer], {type:'application/octet-binary'});    
    console.log("buffer to blob:" + blob)

    var fileReader = new FileReader();
    fileReader.onload = function() {
      var dataUrl = fileReader.result;
      console.log("blob to dataUrl: " + dataUrl);

      var base64 = dataUrl.substr(dataUrl.indexOf(',')+1)      
      console.log("dataUrl to base64: " + base64);
    };
    fileReader.readAsDataURL(blob);
}
张浩然 avatar Jan 10 '2019 06:01 张浩然