Convertir cadena base64 a ArrayBuffer
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
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;
}
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.
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.
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);
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);
}